日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發(fā)布時間:2025/3/16 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1811(拓扑排序+并查集) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

解題思路:

拓撲排序的兩個性質:

①如果一次入隊入度為零的點大于1則說明拓撲排序序列不唯一 ②如果排序的總個數(shù)小于給定的個數(shù),則說明存在回路 可以先把"="的兩個數(shù)用并查集放在一個集合里,這樣就只剩下">"和"<"了,可以用拓撲排序解決了。 不知道為什么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; }

總結

以上是生活随笔為你收集整理的hdu 1811(拓扑排序+并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。