NYOJ 920 Trees
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 920 Trees
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Trees
時間限制:1000?ms ?|? 內存限制:65535?KB 難度:2 描述many different connected components are trees.(T > 1 below):
Case x: A forest of T trees.
Case x: There is one tree.
Case x: No Trees.
x is the case number (starting from 1).
題意:給出一張由n個點和m條邊構成的無向圖,不是連通的,判斷圖的每一部分是否是一個樹,即圖中有幾棵樹。
滿足下列條件可以的點和邊可以構成一棵樹:1.n個點由n-1條邊相連,任意兩個點之間只有一條邊相連。
解題思路:用并查集把各個部分找出來,對于每一部分判斷所有點的度之和與點個數的關系,
如果度之和等于點數*2-2,則可以構成一棵樹。
#include<cstdio> #include<algorithm> #include<vector> using namespace std; const int N = 5e2 + 10; int father[N], deg[N]; vector<int> vec[N];void Initial(int n) //初始化 {for(int i = 1; i <= n; i++)father[i] = i, deg[i] = 0; }int Find(int x) //尋找父節點 {if(father[x] != x)father[x] = Find(father[x]);return father[x]; }void Union(int a, int b) //合并兩個集合 {int p = Find(a);int q = Find(b);if(p != q)father[p] = q; }int main() {int n, m, i, j, cas = 1;while(~scanf("%d%d",&n,&m) && (n+m)){Initial(n); //并查集初始化int u, v;for(i = 0; i < m; i++){scanf("%d%d",&u,&v);deg[u]++;deg[v]++;Union(u,v);} //求每個點的度數for(i = 1; i <= n; i++){vec[i].clear();//刪除容器中保存的所有元素if(Find(i) == i){for(j = 1; j <= n; j++){if(Find(j) == Find(i))vec[i].push_back(j);}}}//找出哪些點屬于同一個集合int ans = 0;for(i = 1; i <= n; i++){int cnt = vec[i].size();if(cnt == 0)continue;int sum = 0;for(j = 0; j < cnt; j++){sum += deg[vec[i][j]];}//求集合中點的度數之和if(sum == cnt * 2 - 2)ans++; //圖中無環}printf("Case %d: ",cas++);if(ans == 0)printf("No Trees.\n");else if(ans == 1)printf("There is one tree.\n");elseprintf("A forest of %d trees.\n",ans);}return 0; }總結
以上是生活随笔為你收集整理的NYOJ 920 Trees的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发10年,全记在这本Java进阶宝典里
- 下一篇: 今天我要批判中台!