思路:首先就是判断是否有奇环,若存在奇环,则输出No。

然后用差分约束找是否符合条件。

对于e(i,j)属于E,并且假设顶点v[i]为正数,那么v[i]-v[j]>=T--->v[j]-v[i]<=-T;

对于e(i,j)不属于E,并且假设顶点v[i]为正数,那么v[i]-v[j]<=T-1;

以0号点为参照点,若果v[i]为负数,那么v[0]-v[i]<=T-1;  v[i]-v[0]<=0;

若果v[i]为正数,那么v[i]-v[0]<=T-1;  v[0]-v[i]<=0;

有上述条件即可建边求最短路,若果存在负圈,那么就是不存在。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define Maxn 1010
#define Maxm Maxn*Maxn
#define inf 100000000
#define T 400
using namespace std;
int head[Maxn],vi[Maxn],col[Maxn],map[Maxn][Maxn],e,n,cnt[Maxn],dis[Maxn];
void init()
{
memset(head,-,sizeof(head));
memset(vi,,sizeof(vi));
memset(map,,sizeof(map));
memset(col,-,sizeof(col));
e=;
}
struct Edge{
int u,next,v,val;
}edge[Maxm];
void addedge(int u, int v)
{
edge[e].u=u;edge[e].v=v;edge[e].next=head[u];head[u]=e++;
edge[e].v=u;edge[e].u=v;edge[e].next=head[v];head[v]=e++;
}
void add(int u,int v,int val)
{
edge[e].u=u,edge[e].v=v,edge[e].val=val,edge[e].next=head[u],head[u]=e++;
}
void find(int u,int c)
{
int i,j,temp;
vi[u]=;
for(i=head[u];i!=-;i=edge[i].next){
temp=edge[i].v;
if(col[temp]==-){
col[temp]=c;
find(temp,c^);
}
}
}
int spfa()
{
int i,j,v,u;
queue<int> q;
memset(cnt,,sizeof(cnt));
memset(vi,,sizeof(vi));
for(i=;i<=n;i++){
dis[i]=inf;
}
dis[]=;
q.push();
while(!q.empty()){
int u=q.front();
q.pop();
vi[u]=;
for(i=head[u];i!=-;i=edge[i].next){
v=edge[i].v;
if(dis[v]>dis[u]+edge[i].val){
dis[v]=dis[u]+edge[i].val;
cnt[v]++;
if(cnt[v]>n) return ;
if(!vi[v]){
q.push(v);
vi[v]=;
}
}
}
}
return ;
}
int solve()
{
int i,j,u,v;
for(i=;i<=n;i++) if(!vi[i]) find(i,);
for(i=;i<e;i++) if(col[edge[i].u]==col[edge[i].v]) return ;
memset(head,-,sizeof(head));
e=;
for(i=;i<=n;i++){
for(j=i+;j<=n;j++){
if(!map[i][j]&&col[i]==col[j]) continue;
u=i,v=j;
if(col[u]==)
swap(u,v);
if(map[u][v])
add(u,v,-T);
else
add(v,u,T-);
}
if(col[i]==){
add(i,,T-);
add(,i,);
}
else{
add(,i,T-);
add(i,,);
}
}
return spfa();
}
int main()
{
int t,i,j;
char str[];
scanf("%d",&t);
while(t--){
scanf("%d",&n);
init();
for(i=;i<=n;i++){
scanf("%s",&str);
for(j=;j<n;j++){
if(str[j]==''&&!map[i][j+]){
addedge(i,j+);
map[i][j+]=map[j+][i]=;
}
}
}
if(!solve())
printf("No\n");
else
printf("Yes\n");
}
return ;
}

hdu 4598 差分约束的更多相关文章

  1. hdu 1531(差分约束)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1531 差分约束的题之前也碰到过,刚好最近正在进行图论专题的训练,就拿来做一做. ①:对于差分不等式,a ...

  2. I - 动物狂想曲 HDU - 6252(差分约束)

    I - 动物狂想曲 HDU - 6252 雷格西桑和路易桑是好朋友,在同一家公司工作.他们总是一起乘地铁去上班.他们的路线上有N个地铁站,编号从1到N.1站是他们的家,N站是公司. 有一天,雷格西桑起 ...

  3. hdu 3666(差分约束,手动栈解决超时问题)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. hdu 1364(差分约束)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12056   Accepted: 4397 Description ...

  5. hdu 1534(差分约束+spfa求最长路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1534 思路:设s[i]表示工作i的开始时间,v[i]表示需要工作的时间,则完成时间为s[i]+v[i] ...

  6. hdu 3440 差分约束

    看完题目第一遍,感觉很简单.当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了.对于这些无序的点,如果高的在右边,不等式是di ...

  7. hdu 1534(差分约束)

    Schedule Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. hdu 3440(差分约束好题)

    House Man Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. POJ 1364 / HDU 3666 【差分约束-SPFA】

    POJ 1364 题解:最短路式子:d[v]<=d[u]+w 式子1:sum[a+b+1]−sum[a]>c      —      sum[a]<=sum[a+b+1]−c−1  ...

随机推荐

  1. 在Button的click事件中引起客户端JavaScript

    void action1_Execute(object sender, SimpleActionExecuteEventArgs e) { WebWindow.CurrentRequestWindow ...

  2. 30.怎样在Swift中添加运行时属性?

    和OC一样,Swift中也可以添加运行时属性.下面将提供一个完整的例子,演示如何给按钮点击事件添加运行时属性. 1.示例 import UIKit var s_GofButtonTouchDownKe ...

  3. 使用Vagrant在Windows下部署开发环境

    做Web开发少不了要在本地搭建好开发环境,虽然说目前各种脚本都有对应的Windows版,甚至是一键安装包,但很多时候和Windows环境的相性并不是那么好,各麻烦的问题是实际部署的环境通常是Linux ...

  4. iepngfix.htc让PNG-24在IE6中透明的方法(转)

    add:360用的一个方法: <!--[if IE 6]> <script src="http://se.360.cn/js/DD_belatedPNG.js"& ...

  5. 使用U盘安装Ubuntu系统的实践小结

    参考教程:http://diybbs.zol.com.cn/1/33925_1942.html   遇到的问题:安装ubuntu 12.04 64位,提示缺少“/casper/vmlinuz.efi ...

  6. 【转】深入浅出REST

    转自:http://www.infoq.com/cn/articles/rest-introduction 不知你是否意识到,围绕着什么才是实现异构的应用到应用通信的“正确”方式,一场争论正进行的如火 ...

  7. Python 条件语句

    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false. Py ...

  8. SMARTFORM报表程序设计(1)

    SMARTFORM是SAP提供的一款商务单据及报表设置工具,可以在FORM中实现数据的计算及转换等功能,并能在FORM创建的同时生成功能模块,为FORM和ABAP程序提供更为强大的参数接口.输入T-C ...

  9. NAVICATE 修改存储过程提示PROCEDURE _Navicat_Temp_Stored_Proc already exists 解决方法

    推测是navicate修改存储过程会自动名为_Navicat_Temp_Stored_Proc的存储过程 创建完毕后自动drop 由于某些原因或bug导致最终没有drop,于是修改存储过程失败. 所以 ...

  10. j2ee项目后置类代码实现跳出iframe页面跳转

    response.getWriter().write("<script>top.location.href='../admin/login';</script>&qu ...