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

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811



题意:有个很多关系,现在需要产生一个名单,有的人比有的人牛逼,有的人没有的人牛逼,有的人一样牛逼,现在需要通过牛逼程度排名,如果1比2牛逼,1的排名就比2前,如果1和2一样牛逼,就比两个人的人品,人品好的人排前面。

现在有三种情况:

1、正确

2、矛盾

3、无法确定



分析:

这里其他方面还是比较简单。首先确定三种情况的发生条件:

矛盾--存在环,也就是在toposort之后,没有把所有的点全都访问到。

无法确定--只要存在一次入度为0的点不止一个,那么这个拓扑序就不唯一,所以无法确定。



代码:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <string>
  4 #include <vector>
  5 #include <map>
  6 #include <set>
  7 #include <queue>
  8 #include <cstring>
  9 #include <algorithm>
 10
 11 using namespace std;
 12
 13
 14 typedef long long ll;
 15 typedef unsigned long long ull;
 16 #define inf (0x3f3f3f3f)
 17 #define lnf (0x3f3f3f3f3f3f3f3f)
 18 #define eps (1e-8)
 19 int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1 ;}
 20
 21 //-------------------------------------------------
 22
 23
 24 const int maxn=10010;
 25 vector<int> edge[maxn];
 26
 27 int indu[maxn];
 28 int par[maxn];
 29 int ranks[maxn];
 30 int u[maxn],v[maxn];
 31 int n,m;
 32 int rn;
 33 char op[maxn][3];
 34
 35 void init(){
 36     for(int i=0;i<n;i++){
 37         par[i]=i;
 38         ranks[i]=0;
 39         edge[i].clear();
 40     }
 41     memset(indu,0,sizeof(indu));
 42 }
 43
 44 int findx(int x){
 45     if(par[x]==x)return x;
 46     else return par[x]=findx(par[x]);
 47 }
 48
 49 bool unite(int x,int y){
 50     x=findx(x);
 51     y=findx(y);
 52     if(x==y)return false;
 53     if(ranks[x]>ranks[y]){
 54         par[y]=x;
 55     }
 56     else{
 57         if(ranks[x]==ranks[y]){
 58             ranks[y]++;
 59         }
 60         par[x]=y;
 61     }
 62     return true;
 63 }
 64
 65
 66 bool toposort(){
 67     queue<int> q;
 68     for(int i=0;i<n;i++){
 69         if(indu[i]==0&&i==findx(i)){
 70             indu[i]--;
 71             q.push(i);
 72         }
 73     }
 74     bool allon=false;
 75
 76     while(!q.empty()){
 77         if(q.size()>1)allon=true;
 78         int u=q.front();
 79         q.pop();
 80         rn--;
 81         for(int i=0;i<edge[u].size();i++){
 82             indu[edge[u][i]]--;
 83             if(indu[edge[u][i]]==0){
 84                 q.push(edge[u][i]);
 85             }
 86         }
 87     }
 88     return allon;
 89 }
 90
 91
 92 void solve(){
 93     while(~scanf("%d%d",&n,&m)){
 94         init();
 95         rn=n;
 96         for(int i=0;i<m;i++){
 97             scanf("%d%s%d",&u[i],op[i],&v[i]);
 98             if(op[i][0]==‘=‘){
 99                 if(unite(u[i],v[i])){
100                     rn--;
101                 }
102             }
103         }
104         for(int i=0;i<m;i++){
105             if(op[i][0]!=‘=‘){
106                 int x=findx(u[i]);
107                 int y=findx(v[i]);
108                 if(op[i][0]==‘>‘){
109                     edge[x].push_back(y);
110                     indu[y]++;
111                 }
112                 else{
113                     edge[y].push_back(x);
114                     indu[x]++;
115                 }
116             }
117         }
118         bool allon=toposort();
119         if(rn>0){
120             puts("CONFLICT");
121         }
122         else if(allon){
123             puts("UNCERTAIN");
124         }
125         else{
126             puts("OK");
127         }
128     }
129
130 }
131
132
133
134 int main(){
135
136 #ifndef ONLINE_JUDGE
137     freopen("1.in","r",stdin);
138     //freopen("1.out","w",stdout);
139 #endif
140
141     solve();
142 }
时间: 2024-10-13 19:43:40

(拓扑排序+并查集)HDU - 1811 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): 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(并查集按秩合并+拓扑排序)

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

HDU 1811 Rank of Tetris (并查集预处理 + 拓扑排序)

链接 :  http://acm.hdu.edu.cn/showproblem.php?pid=1811 题目为中文. 可以考虑把rating相同的人放到一个集合里 集合里的人可以认为按照编号排序的,可以使用并查集. 预处理了之后可以考虑在同一个集合里不会出现两个不同的rating 出现即为矛盾 否则可以 以两个集合的根节点建边. 图建好了之后可以保证每个点里面的人的rating相同.只需要再判断是否有环 . 拓扑序是否唯一. 判断拓扑序唯一就是每次队列中只能存在一个集合,否则就是可以有多种

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

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从高到低

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 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又想