首页 > 代码库 > HDU 4598 Difference
HDU 4598 Difference
Difference
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 581 Accepted Submission(s): 152
Problem Description
A graph is a difference if every vertex vi can be assigned a real number ai and there exists a positive real number T such that
(a) |ai| < T for all i and
(b) (vi, vj) in E <=> |ai - aj| >= T,
where E is the set of the edges.
Now given a graph, please recognize it whether it is a difference.
(a) |ai| < T for all i and
(b) (vi, vj) in E <=> |ai - aj| >= T,
where E is the set of the edges.
Now given a graph, please recognize it whether it is a difference.
Input
The first line of input contains one integer TC(1<=TC<=25), the number of test cases.
Then TC test cases follow. For each test case, the first line contains one integer N(1<=N<=300), the number of vertexes in the graph. Then N lines follow, each of the N line contains a string of length N. The j-th character in the i-th line is "1" if (vi, vj) in E, and it is "0" otherwise. The i-th character in the i-th line will be always "0". It is guaranteed that the j-th character in the i-th line will be the same as the i-th character in the j-th line.
Then TC test cases follow. For each test case, the first line contains one integer N(1<=N<=300), the number of vertexes in the graph. Then N lines follow, each of the N line contains a string of length N. The j-th character in the i-th line is "1" if (vi, vj) in E, and it is "0" otherwise. The i-th character in the i-th line will be always "0". It is guaranteed that the j-th character in the i-th line will be the same as the i-th character in the j-th line.
Output
For each test case, output a string in one line. Output "Yes" if the graph is a difference, and "No" if it is not a difference.
Sample Input
3
4
0011
0001
1000
1100
4
0111
1001
1001
1110
3
000
000
000
Sample Output
Yes
No
Yes
Hint
In sample 1, it can let T=3 and a[sub]1[/sub]=-2, a[sub]2[/sub]=-1, a[sub]3[/sub]=1, a[sub]4[/sub]=2.
Source
2013 ACM-ICPC吉林通化全国邀请赛——题目重现
Recommend
liuyiding
解题:差分约束,完全不懂为什么要这样子。学渣的无奈啊
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #include <string> 11 #include <set> 12 #include <stack> 13 #define LL long long 14 #define pii pair<int,int> 15 #define INF 0x3f3f3f3f 16 using namespace std; 17 const int maxn = 345,T = 1234; 18 struct arc{ 19 int u,v,w; 20 arc(int x = 0,int y = 0,int z = 0){ 21 u = x; 22 v = y; 23 w = z; 24 } 25 }; 26 vector<int>g[maxn]; 27 vector<int>G[maxn]; 28 vector<arc>e; 29 char mp[maxn][maxn]; 30 int n,color[maxn],d[maxn],cnt[maxn]; 31 bool in[maxn]; 32 void dfs(int u,int c){ 33 color[u] = c; 34 for(int i = 0; i < g[u].size(); i++) 35 if(!color[g[u][i]]) dfs(g[u][i],-c); 36 } 37 void add(int u,int v,int w){ 38 e.push_back(arc(u,v,w)); 39 G[u].push_back(e.size()-1); 40 } 41 bool spfa(){ 42 queue<int>q; 43 for(int i = 0; i < n; i++){ 44 d[i] = 0; 45 cnt[i] = 1; 46 in[i] = true; 47 q.push(i); 48 } 49 while(!q.empty()){ 50 int u = q.front(); 51 q.pop(); 52 in[u] = false; 53 for(int i = 0; i < G[u].size(); i++){ 54 arc &temp = e[G[u][i]]; 55 if(d[temp.v] > d[u]+temp.w){ 56 d[temp.v] = d[u]+temp.w; 57 if(!in[temp.v]){ 58 in[temp.v] = true; 59 cnt[temp.v]++; 60 if(cnt[temp.v] > n) return true; 61 q.push(temp.v); 62 } 63 } 64 } 65 } 66 return false; 67 } 68 bool solve(){ 69 for(int i = 0; i < n; i++) if(!color[i]) dfs(i,1); 70 for(int i = 0; i < n; i++) 71 for(int j = 0; j < g[i].size(); j++) 72 if(color[i] == color[g[i][j]]) return false; 73 for(int i = 0; i < n; i++){ 74 for(int j = i+1; j < n; j++){ 75 if(mp[i][j] == ‘1‘) 76 color[i] == 1?add(i,j,-T):add(j,i,-T); 77 else color[i] == 1?add(j,i,T-1):add(i,j,T-1); 78 } 79 } 80 return !spfa(); 81 } 82 int main() { 83 int ks,i,j; 84 scanf("%d",&ks); 85 while(ks--){ 86 scanf("%d",&n); 87 for(i = 0; i <= n; i++){ 88 g[i].clear(); 89 G[i].clear(); 90 color[i] = 0; 91 } 92 e.clear(); 93 for(i = 0; i < n; i++){ 94 scanf("%s",mp[i]); 95 for(j = 0; j < n; j++) 96 if(mp[i][j] == ‘1‘) g[i].push_back(j); 97 } 98 solve()?puts("Yes"):puts("No"); 99 }100 return 0;101 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。