hdu 1811(拓扑排序+并查集)
生活随笔
收集整理的這篇文章主要介紹了
hdu 1811(拓扑排序+并查集)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
解題思路:
拓?fù)渑判虻膬蓚€性質(zhì):
①如果一次入隊入度為零的點大于1則說明拓?fù)渑判蛐蛄胁晃ㄒ? ②如果排序的總個數(shù)小于給定的個數(shù),則說明存在回路 可以先把"="的兩個數(shù)用并查集放在一個集合里,這樣就只剩下">"和"<"了,可以用拓?fù)渑判蚪鉀Q了。 不知道為什么TLE了。。待解決#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std;const int maxn = 10005; int n,m,cnt,fa[maxn],in[maxn]; int que[maxn],head,tail; vector<int> G[maxn];void init() {for(int i = 0; i <= n; i++)fa[i] = i;memset(in,0,sizeof(in));cnt = n;head = tail = 0; }int find(int x) {if(fa[x] == x) return x;return fa[x] = find(fa[x]); }void Union(int x,int y) {int fx = find(x);int fy = find(y);if(fx != fy){fa[fy] = fx;cnt--;} }int main() {char str[2];int a,b;while(scanf("%d%d",&n,&m)!=EOF){bool f1 = false,f2 = false;init();for(int i = 1; i <= n; i++){scanf("%d %s %d",&a,str,&b);if(str[0] == '=')Union(a,b);else if(str[0] == '>'){int fa = find(a);int fb = find(b);if(fa == fb){f1 = true;continue;}in[fb]++;G[fa].push_back(fb);}else{int fa = find(a);int fb = find(b);if(fa == fb){f1 = true;continue;}in[fa]++;G[fb].push_back(fa);}}for(int i = 0; i < n; i++)if(in[i] == 0 && find(i) == i)que[tail++] = i;while(head < tail){if(tail - head > 1) f2 = true;int t = que[head++];cnt--;for(int i = 0; i < G[t].size(); i++){in[G[t][i]]--;if(in[G[t][i]] == 0)que[tail++] = G[t][i];}}if(cnt > 0 || f1 == true)printf("CONFLICT\n");else if(f2 == true)printf("UNCERTAIN\n");else printf("OK\n");}return 0; }
總結(jié)
以上是生活随笔為你收集整理的hdu 1811(拓扑排序+并查集)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iframe父子级页面传值支持跨域访问j
- 下一篇: CSS中的margin、border、p