hdu 1811 Rank of Tetris (拓扑排序+并查集)
2017-09-28 22:52
447 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1811
/*
思路:相等的数可以看做一个,用并查集合并作为一个数。和儿子节点的边也都可以转化为和父节点的边。
*/
/*
思路:相等的数可以看做一个,用并查集合并作为一个数。和儿子节点的边也都可以转化为和父节点的边。
*/
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; const int maxn=10005; int in[maxn],sum,n,m,X[maxn],Y[maxn],fa[maxn]; vector<int > G[maxn]; char c[maxn]; void toposort(){ queue<int>s; int flag=0; for(int i=0;i<n;i++){ if(in[i]==0&&fa[i]==i) //收入入度为0的点 s.push(i); } while(!s.empty()){ //由于互为环的点的入度是不会为0的,所以不会被push进来 if(s.size()>1) //只要入度不唯一,排名就不确定。 flag=1; int pos=s.front(); s.pop(),sum--; for(int i=0;i<G[pos].size();i++){ in[G[pos][i]]--; //与pos相连的点入度减一 if(in[G[pos][i]]==0) s.push(G[pos][i]); //收入新一波入度为0的点 } } if(sum>0) printf("CONFLICT\n"); //有环,sum无法-- else if(flag) printf("UNCERTAIN\n"); else printf("OK\n"); } void init(){ memset(G,0,sizeof(G)); memset(in,0,sizeof(in)); for(int i=0;i<n;i++) fa[i]=i; } int find(int x){ //查找并认爸爸 if(x!=fa[x]) fa[x]=find(fa[x]); return fa[x]; } bool Union(int x,int y){ int a=find(x); int b=find(y); if(a==b) return false; fa[a]=b; return true; } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ init(); sum=n; for(int i=0;i<m;i++){ scanf("%d %c %d",&X[i],&c[i],&Y[i]); if(c[i]=='='){ if(Union(X[i],Y[i])) //如果他俩互为爸爸当然不能再减一次,所以这里的合并之后需要判断爸爸是否相同。 sum--; } } for(int i=0;i<m;i++){ if(c[i]=='=') continue; int x=find(X[i]),y=find(Y[i]); if(c[i]=='>'){ G[x].push_back(y); in[y]++; } else{ G[y].push_back(x); in[x]++; } } toposort(); } return 0; }
相关文章推荐
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
- HDU 1811 -- Rank of Tetris(拓扑排序+并查集)
- hdu 1811 Rank of Tetris(拓扑排序+并查集)
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
- hdu 1811 Rank of Tetris 拓扑排序+并查集
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
- hdu 1811 Rank of Tetris 拓扑排序+并查集
- HDU 1811 Rank of Tetris (拓扑排序+并查集)
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
- 【HDU 1811 Rank of Tetris】(拓扑排序判环 + 并查集合并)
- hdu 1811 Rank of Tetris
- HDU 1811 Rank of Tetris (并查集预处理 + 拓扑排序)
- hdu 1811 Rank of Tetris(并查集+拓扑)
- hdu 1811 rank of tetras 拓扑排序+并查集
- HDU 1811 Rank of Tetris(并查集+拓扑排序)
- hdu1811 Rank of Tetris --- 拓扑排序
- hdu 1811 Rank of Tetris (并查集 + 拓扑排序)
- hdu 1811 Rank of Tetris(拓扑,并查集)