日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 5222

發布時間:2025/3/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 5222 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先對于所有的無向邊,我們使用并查集將兩邊的點并起來 若一條邊未合并之前,兩端的點已經處于同一個集合了,那么說明必定存在可行的環(因為這兩個點處于同一個并查集集合中,那么它們之間至少存在一條路徑) 如果上一步沒有判斷出環,那么僅靠無向邊是找不到環的 考慮到,處于同一個并查集集合中的點之間必定存在一條路徑互達,因此將一個集合的點合并之后,原問題等價于在新生成的有向圖中是否有環 我們知道,有向無環圖必定存在拓撲序,因此只需使用拓撲排序判定即可 時間復雜度O(N+M1+M2)O(N + M1 + M2)O(N+M1+M2)

?

笨人搓碼? hdu的棧溢出真是快讓我炸了。。

?

1 /*Author :usedrose */ 2 /*Created Time :2015/7/31 18:35:37*/ 3 /*File Name :2.cpp*/ 4 #pragma comment(linker, "/STACK:102400000,102400000") 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <sstream> 9 #include <cstdlib> 10 #include <cstring> 11 #include <climits> 12 #include <vector> 13 #include <string> 14 #include <ctime> 15 #include <cmath> 16 #include <deque> 17 #include <queue> 18 #include <stack> 19 #include <set> 20 #include <map> 21 #define INF 0x3f3f3f3f 22 #define eps 1e-8 23 #define pi acos(-1.0) 24 #define MAXN 1000000 25 #define OK cout << "ok" << endl; 26 #define o(a) cout << #a << " = " << a << endl 27 #define o1(a,b) cout << #a << " = " << a << " " << #b << " = " << b << endl 28 using namespace std; 29 typedef long long LL; 30 31 int fa[MAXN]; 32 int n, m1, m2; 33 vector<int> G[MAXN]; 34 int vis[MAXN], ind[MAXN]; 35 36 int findset(int x) 37 { 38 return fa[x] = fa[x] == x ? x:findset(fa[x]); 39 } 40 41 bool merg(int a, int b) 42 { 43 int x = findset(a); 44 int y = findset(b); 45 if (x == y) return false; 46 fa[x] = y; 47 return true; 48 } 49 50 void init() 51 { 52 for (int i = 1;i <= n; ++ i) { 53 fa[i] = i; 54 ind[i] = 0; 55 G[i].clear(); 56 } 57 } 58 59 60 bool toposort() 61 { 62 queue<int> Q; 63 for (int i = 1;i <= n; ++ i) { 64 if (ind[i] == 0 && fa[i] == i) 65 Q.push(i); 66 } 67 while (!Q.empty()) { 68 int t = Q.front(); 69 Q.pop(); 70 for (int i = 0;i < G[t].size(); ++ i) { 71 int v = G[t][i]; 72 if (--ind[v] == 0) 73 Q.push(v); 74 } 75 } 76 for (int i = 1;i <= n; ++ i) 77 if (ind[i]) 78 return false; 79 return true; 80 } 81 82 int main() 83 { 84 //freopen("data.in","r",stdin); 85 //freopen("data.out","w",stdout); 86 int T; 87 scanf("%d", &T); 88 while (T--) { 89 scanf("%d%d%d", &n, &m1, &m2); 90 init(); 91 bool ans = true; 92 int x, y; 93 for (int i = 1;i <= m1; ++ i) { 94 scanf("%d%d", &x, &y); 95 ans &= merg(x, y); 96 } 97 98 for (int i = 1;i <= m2; ++ i) { 99 scanf("%d%d", &x, &y); 100 x = findset(x); 101 y = findset(y); 102 G[x].push_back(y); 103 ind[y]++; 104 } 105 if (ans == 0) { 106 puts("YES"); 107 continue; 108 } 109 110 ans = toposort(); 111 puts(ans? "NO" : "YES"); 112 } 113 return 0; 114 }

?

轉載于:https://www.cnblogs.com/usedrosee/p/4692992.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的hdu 5222的全部內容,希望文章能夠幫你解決所遇到的問題。

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