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

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <vector>
  4 #include <queue>
  5 using namespace std;
  6 struct node//边
  7 {
  8     int a, b;//顶点
  9     char ch;//运算符
 10 }c[10005];
 11 vector<int>map[10005];//map数组存贮邻接表 (大佬都是这么开数组的)
 12 int n, m, sum, in[10005], fa[10005];//in数组表示入度,fa[i]表示顶点i所在集合的根节点
 13
 14 int find(int x)//查找根节点
 15 {
 16     if (fa[x] != x) fa[x] = find(fa[x]);
 17     return fa[x];
 18 }
 19
 20 bool comb(int x, int y)//合并集合
 21 {
 22     x = find(x);
 23     y = find(y);
 24     if (x == y)
 25         return false;
 26     else
 27     {
 28         fa[y] = x;
 29         return true;
 30     }
 31 }
 32
 33 void init()//初始化
 34 {
 35     for (int i = 0; i<n; i++)
 36         fa[i] = i;
 37 }
 38
 39 void top_sort()//queue实现拓扑排序
 40 {
 41     queue<int>s;
 42     int flag = 0;
 43     for (int i = 0; i<n; i++)
 44     {
 45         //找到入度为零的切祖宗为自己的加入到队列中
 46         if (in[i] == 0 && fa[i] == i)
 47             s.push(i);
 48     }
 49     while (!s.empty())
 50     {
 51         if (s.size() > 1)//即使发现信息不完整也要继续运行下去,因为如果信息同时不完整和冲突都是CONFLICT
 52             flag = 1;
 53         int pos = s.front();
 54         s.pop(), sum--;    //记录下运行的次数
 55         for (int i = 0; i<map[pos].size(); i++)
 56         {
 57             in[map[pos][i]]--;
 58             if (in[map[pos][i]] == 0)
 59                 s.push(map[pos][i]);
 60         }
 61     }
 62     if (sum>0) printf("CONFLICT\n");    //冲突,即有多个入度为零且祖宗为自己的出现
 63     else if (flag) printf("UNCERTAIN\n");
 64     else printf("OK\n");
 65 }
 66
 67 int main()
 68 {
 69     while (scanf("%d %d", &n, &m) != EOF)
 70     {
 71         sum = n;
 72         init();
 73         memset(map, 0, sizeof(map));
 74         memset(in, 0, sizeof(in));
 75         for (int i = 0; i<m; i++)
 76         {
 77             scanf("%d %c %d", &c[i].a, &c[i].ch, &c[i].b);
 78             //如果相等,就合并为同一个集合
 79             if (c[i].ch == ‘=‘)
 80             {
 81                 if (comb(c[i].a, c[i].b))
 82                     sum--;
 83             }
 84         }
 85         for (int i = 0; i<m; i++)
 86         {
 87             if (c[i].ch == ‘=‘)
 88                 continue;
 89             int x = find(c[i].a);
 90             int y = find(c[i].b);
 91             if (c[i].ch == ‘>‘)
 92             {
 93                 map[x].push_back(y);
 94                 in[y]++;
 95             }
 96             else
 97             {
 98                 map[y].push_back(x);
 99                 in[x]++;
100             }
101         }
102         top_sort();
103     }
104     //system("pause");
105     return 0;
106 }
时间: 2024-10-12 17:28:24

hdu1811 Rank of Tetris 并查集+拓扑排序的相关文章

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): 5672    Accepted Submission(s): 1616 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): 5415    Accepted Submission(s): 1514 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了

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

1 /* 2 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B,小于B. 3 4 现在Lele并不是让你来帮他制作这个高手榜,他只是想知道,根据这些信息是否能够确定出这个高手榜,是的话就输出"OK". 5 否则就请你判断出错的原因,到底是因为信息不完全(输出"UNCERTAIN"),还是因为这些信息中包含冲突(输出&quo

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

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

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

http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球.为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按

hdu--1811--并查集&amp;&amp;拓扑排序&lt;好题&gt;

做了这题 绝逼 累啊.. mle -- re<stack overflow>--tle--wa---ac 经过这么5步 终于AC了 这题 我觉得可以让你更好地来 理解 拓扑排序的一些细节问题 首先 这题 为什么要用到并查集呢? 因为 会有 A = B这种情况的出现 然后可能再来个 B =C A = D....那么我们就需要将它们全部表示成一个点 那么就是都用一个根结点来表示 然后 这边 是要判断 能不能根据给出的条件 形成一个排列 那么就是个 拓扑问题 根据 > <情况来判断 我觉

hdu 1811 Rank of Tetris 【并查集+拓扑排序】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811 分析: 很明显是道拓扑排序的题,有一点就是处理实力相等的问题: 可以用并查集把实力相等的组成一个集合. 说一下拓扑排序的性质: 1.如果入度为0的点大于1,则排序不唯一 2.如果排序的总数小于给定的数,则存在环路 献上代码: #include<stdio.h> #include<string.h> #include<algorithm> #include<ios

[HDOJ1811]Rank of Tetris(并查集、拓扑排序)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811 求一堆数据的拓扑序. 处理:x>y就是x到y一条边,x<y就是y到x一条边.关键问题是处理x=y的情况. 假如x=y,就有问题了.假如不处理的话,可能会被当成少处理一个点而使结果编程UNCERTAIN.所以我们考虑用并查集来解决这个问题. 选谁当祖先?题中又给了一个其他的量叫做RP值,这个RP值的规律是序号越大RP值越大.这样我们可以在合并的时候,尽可能地将RP值大的数当成本集合的祖先. 1

hdoj-1811-Rank of Tetris【并查集+拓扑排序】

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