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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)

發布時間:2025/3/8 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 /************************************************************************* 2 > File Name: j.cpp 3 > Author: HJZ 4 > Mail: 2570230521@qq.com 5 > Created Time: 2014年08月28日 星期四 12時26分13秒 6 ************************************************************************/ 7 8 //提議:能否將一個給定的有向圖,變成兩個完全圖(任意兩點都直接相連,雙向邊) 9 10 #include <queue> 11 #include <string> 12 #include <cstdio> 13 #include <stack> 14 #include <cstring> 15 #include <iostream> 16 #include <algorithm> 17 #define N 105 18 using namespace std; 19 20 int a[N], b[N]; 21 //a, b集合初始化爲空! 22 int g[N][N]; 23 int n; 24 25 bool flag; 26 27 bool dfs(int u, int la, int lb){ 28 if(u>n && la+lb==n) return true;//如果a ,b集合中的元素數目恰好是n,則說明可以形成兩個完全圖! 29 bool flagx=true; 30 for(int i=0; i<la && flagx; ++i) 31 if(!(g[a[i]][u] && g[u][a[i]])) 32 flagx=false; 33 if(flagx) a[la]=u;//如果u節點可以放入a集合中 34 if(flagx && dfs(u+1, la+1, lb)) return true; 35 bool flagy=true; 36 for(int i=0; i<lb && flagy; ++i) 37 if(!(g[b[i]][u] && g[u][b[i]])) 38 flagy=false; 39 if(flagy) b[lb]=u;//如果u節點可以放入b集合中 40 if(flagy && dfs(u+1, la, lb+1)) return true; 41 return false; 42 } 43 44 int main(){ 45 while(scanf("%d", &n)!=EOF){ 46 memset(g, 0, sizeof(g)); 47 for(int i=1; i<=n; ++i){ 48 int v; 49 vis[i]=0; 50 while(scanf("%d", &v) && v) 51 g[i][v]=1; 52 } 53 flag=dfs(1, 0, 0); 54 if(flag) 55 printf("YES\n"); 56 else printf("NO\n"); 57 } 58 return 0; 59 }

1 /************************************************************************* 2 > File Name: j.cpp 3 > Author: HJZ 4 > Mail: 2570230521@qq.com 5 > Created Time: 2014年08月28日 星期四 12時26分13秒 6 ************************************************************************/ 7 //思路:bfs,和判斷二分圖差不多,將圖分成兩個集合,如果a和b都有g[a][b]&&g[b][a]說明 8 //a和b一定在同一個集合中,如果有a,b不在一個集合中,a,c不在同一個集合中,b,c也不在同一個 9 //集合中,出現矛盾!也就是這個圖不能分成兩個完全圖! 10 #include <queue> 11 #include <string> 12 #include <cstdio> 13 #include <stack> 14 #include <cstring> 15 #include <iostream> 16 #include <algorithm> 17 #define N 105 18 using namespace std; 19 queue<int>q; 20 int g[N][N]; 21 int coll[N]; 22 int n; 23 24 bool bfs(int u){ 25 while(!q.empty()) q.pop(); 26 q.push(u); 27 while(!q.empty()){ 28 int x=q.front(); 29 q.pop(); 30 for(int y=1; y<=n; ++y){ 31 if(x==y || g[x][y]&&g[y][x]) continue; 32 if(coll[y]==-1){ 33 coll[y]=coll[x]^1; 34 q.push(y); 35 } 36 else if(coll[y]==coll[x]) 37 return true; 38 } 39 } 40 return false; 41 } 42 43 int main(){ 44 while(scanf("%d", &n)!=EOF){ 45 memset(g, 0, sizeof(g)); 46 for(int i=1; i<=n; ++i){ 47 int v; 48 while(scanf("%d", &v) && v) 49 g[i][v]=1; 50 coll[i]=-1; 51 } 52 int i; 53 for(i=1; i<=n; ++i){ 54 if(coll[i]==-1){ 55 coll[i]=0;//默認是在集合0中 56 if(bfs(i)) break; 57 } 58 } 59 if(i<=n) printf("NO\n"); 60 else printf("YES\n"); 61 } 62 return 0; 63 }

?

?

轉載于:https://www.cnblogs.com/hujunzheng/p/3942077.html

總結

以上是生活随笔為你收集整理的hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)的全部內容,希望文章能夠幫你解決所遇到的問題。

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