hdu 4598 差分约束
思路:首先就是判断是否有奇环,若存在奇环,则输出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 差分约束的更多相关文章
- hdu 1531(差分约束)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1531 差分约束的题之前也碰到过,刚好最近正在进行图论专题的训练,就拿来做一做. ①:对于差分不等式,a ...
- I - 动物狂想曲 HDU - 6252(差分约束)
I - 动物狂想曲 HDU - 6252 雷格西桑和路易桑是好朋友,在同一家公司工作.他们总是一起乘地铁去上班.他们的路线上有N个地铁站,编号从1到N.1站是他们的家,N站是公司. 有一天,雷格西桑起 ...
- hdu 3666(差分约束,手动栈解决超时问题)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 1364(差分约束)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12056 Accepted: 4397 Description ...
- hdu 1534(差分约束+spfa求最长路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1534 思路:设s[i]表示工作i的开始时间,v[i]表示需要工作的时间,则完成时间为s[i]+v[i] ...
- hdu 3440 差分约束
看完题目第一遍,感觉很简单.当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了.对于这些无序的点,如果高的在右边,不等式是di ...
- hdu 1534(差分约束)
Schedule Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 3440(差分约束好题)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 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 ...
随机推荐
- OC三种方法实现定时器
在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 在iOS中有很多方法完成定时器的任务,例如 NSTimer.CADisp ...
- url中的scheme
iPhone上URL Schemes的作用为应用程序提供了一个其他应用程序或者safari可以启动他的方法. --http://blog.sina.com.cn/s/blog_5673c12f0100 ...
- (剑指Offer)面试题23:从上到下打印二叉树
题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 很明显,这是一个广度优先遍历. 需要一个队列容器来保存结点,具体操作: 1.将根结点压入队列中,并打印根结点:如果根结点有子结点 ...
- MVC ajax 上传文件
废话不多说,上代码: 用到的js文件: jquery.min.js jquery.easyui.min.js <input id="fileurl" onclick=&quo ...
- CMSIS Example - Mail and Timer
#include <stdint.h> #include "bsp-fifisdr.h" #include "lpclib.h" #include ...
- registerClassAlias()函数和getClassByAlias()函数
flash.net 包中包含包级函数,可用于打开新的浏览器窗口,向服务器发送 URL 请求以及处理类别名. registerClassAlias()函数 public function registe ...
- C++学习笔记之字符函数库cctype
C++从C语言继承了一个与字符相关的.非常方便的函数软件包,它可以简化诸如确定字符是否为大写字母.数字.标点符号等工作,这些函数原型是在头文件cctype(老式风格ctype.h)中定义的. 下表对这 ...
- cdoj 24 8球胜负(eight) 水题
8球胜负(eight) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/24 ...
- android标题栏(titlebar)显示进度条
在后台线程中执行各种操作(网络连接.大数据存储)的时候,我们希望让客户能看到后台有操作在进行,那么既能有效的提示用户,又不占用当前操作空间,最好的方法就是在标题栏有个进度条. [代码] [Java]代 ...
- 程序的内存分配 C\C++
原文:http://blog.csdn.net/oohaha_123/article/details/24460425 程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区( ...