hdu 1811 拓扑排序+并查集+细心

题意和方法都很简单,只是需要注意的地方很多,例如加边时起点终点可能在一个集合内,还有既冲突也不全的情况优先判断冲突。

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 #include <queue>
  5 using namespace std;
  6
  7 const int N = 10000;
  8 const int M = 20000;
  9 int f[N];
 10 int head[N];
 11 int in[N];
 12 int n, m, e, sum;
 13
 14 int findf( int x )
 15 {
 16     if ( f[x] != x ) f[x] = findf(f[x]);
 17     return f[x];
 18 }
 19
 20 void union_set( int x, int y )
 21 {
 22     x = findf(x), y = findf(y);
 23     if ( x != y )
 24     {
 25         f[x] = y;
 26     }
 27 }
 28
 29 struct Op
 30 {
 31     int a, b;
 32     char r[2];
 33 } op[M];
 34
 35 struct Edge
 36 {
 37     int v, next;
 38 } edge[M];
 39
 40 void addEdge( int u, int v )
 41 {
 42     edge[e].v = v;
 43     edge[e].next = head[u];
 44     head[u] = e++;
 45 }
 46
 47 int main ()
 48 {
 49     while ( scanf("%d%d", &n, &m) != EOF )
 50     {
 51         e = 0;
 52         sum = n;
 53         memset( head, -1, sizeof(head) );
 54         memset( in, 0, sizeof(in) );
 55         for ( int i = 0; i < n; i++ ) f[i] = i;
 56         for ( int i = 0; i < m; i++ )
 57         {
 58             scanf("%d%s%d", &op[i].a, op[i].r, &op[i].b);
 59             if ( op[i].r[0] == ‘=‘ )
 60             {
 61                 sum--;
 62                 union_set( op[i].a, op[i].b );
 63             }
 64         }
 65         bool flag0 = false;
 66         for ( int i = 0; i < m; i++ )
 67         {
 68             if ( op[i].r[0] == ‘=‘ ) continue;
 69             int a = findf(op[i].a), b = findf(op[i].b);
 70             if ( a == b )
 71             {
 72                 flag0 = true;
 73                 break;
 74             }
 75             if ( op[i].r[0] == ‘<‘ )
 76             {
 77                 addEdge( b, a );
 78                 in[a]++;
 79             }
 80             else
 81             {
 82                 addEdge( a, b );
 83                 in[b]++;
 84             }
 85         }
 86         if ( flag0 )
 87         {
 88             puts("CONFLICT");
 89             continue;
 90         }
 91         queue<int> q;
 92         for ( int i = 0; i < n; i++ )
 93         {
 94             if ( !in[i] && f[i] == i ) q.push(i);
 95         }
 96         bool flag1 = false;
 97         while ( !q.empty() )
 98         {
 99             if ( q.size() > 1 ) flag1 = 1;
100             int u = q.front();
101             q.pop();
102             sum--;
103             for ( int i = head[u]; i != -1; i = edge[i].next )
104             {
105                 int v = edge[i].v;
106                 in[v]--;
107                 if ( in[v] == 0 )
108                 {
109                     q.push(v);
110                 }
111             }
112         }
113         if ( sum > 0 )
114         {
115             puts("CONFLICT");
116         }
117         else
118         {
119             if ( flag1 ) puts("UNCERTAIN");
120             else puts("OK");
121         }
122     }
123     return 0;
124 }
时间: 2024-10-28 16:36:04

hdu 1811 拓扑排序+并查集+细心的相关文章

hdu 1811(拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7961    Accepted Submission(s): 2266 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为 了更好的符合那些爱好者的喜好,Lele又想

hdu 1811 Rank of Tetris (拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4931 Accepted Submission(s): 1359 Problem Description自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他

hdu1811 Rank of Tetris(拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6920    Accepted Submission(s): 1947 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

hdu 1811 Rank of Tetris(拓扑排序+并查集)

1 #include "cstdio" 2 #include "iostream" 3 #include "cstring" 4 #include "vector" 5 #include "queue" 6 using namespace std; 7 const int N = 10005; 8 int n, m, t; 9 int fa[N]; 10 int rank[N]; 11 int X[2*N]

HDU 1811 Rank of Tetris 拓扑排序+并查集

Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低

拓扑排序 - 并查集 - Rank of Tetris

Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按这几个人的RP从高到低来排. 终于,Lele要开始行动了,对N个人进行排名.为了方便起见,每个人都已经被编号,分别从0到N-1,并且编号越

LA 4255 (拓扑排序 并查集) Guess

设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 15; 5 int n; 6 int G[maxn][maxn]; 7 char s[100]; 8 int sum[maxn], a[maxn]; 9 10

2015 ACM/ICPC Asia Regional Changchun Online Pro 1002 (拓扑排序+并查集)

Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Betty owns a lot of ponds, some of them are connected with other ponds by pipes, and th

(拓扑排序+并查集)HDU - 1811 Rank of Tetris

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811 题意:有个很多关系,现在需要产生一个名单,有的人比有的人牛逼,有的人没有的人牛逼,有的人一样牛逼,现在需要通过牛逼程度排名,如果1比2牛逼,1的排名就比2前,如果1和2一样牛逼,就比两个人的人品,人品好的人排前面. 现在有三种情况: 1.正确 2.矛盾 3.无法确定 分析: 这里其他方面还是比较简单.首先确定三种情况的发生条件: 矛盾--存在环,也就是在toposort之后,没有把所有的点全都