PAT甲级1013 Battle Over Cities:[C++题解]并查集、结构体存边
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1013 Battle Over Cities:[C++题解]并查集、结构体存边
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
來源:acwing
分析:并查集題目。
不清楚并查集的小伙伴,請移步并查集原理并查集板子:acwing836. 合并集合。
題意:給定一個連通圖,當刪掉任意1個點后,問剩下幾個連通塊。
解題:
AC代碼
#include<bits/stdc++.h> using namespace std; const int N = 1e3+10,M= 500010; int n , m, k; int p[N]; struct Edge{int a,b; }e[M];//并查集模板,找根 int find(int x){if(p[x] != x) p[x] =find(p[x]);return p[x]; } int main(){scanf("%d%d%d",&n,&m,&k);//讀邊for(int i = 0; i<m ; i ++) scanf("%d%d",&e[i].a,&e[i].b);//讀詢問while(k--){int x;scanf("%d",&x);//初始化并查集,n個集合for(int i =1; i<=n; i++) p[i] = i;int cnt = n-1; //統計不同連通塊的數量//遍歷每一條邊for(int i =0 ;i<m; i++){int a = e[i].a,b =e[i].b;//如果該邊的兩個端點和刪掉的點都沒有關系if( a != x && b != x){//看是否屬于同一個集合int pa = find(a) ,pb = find(b);//不屬于的話,合并成一個集合,同時不同連通塊的數量--。if(pa != pb){p[pa] =pb; cnt --;}}}//最終的建邊數量,等于不同連通塊數量-1;printf("%d\n",cnt-1);} }題目鏈接
PAT甲級1013 Battle Over Cities
https://www.acwing.com/problem/content/1487/
總結
以上是生活随笔為你收集整理的PAT甲级1013 Battle Over Cities:[C++题解]并查集、结构体存边的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1145 Hashing -
- 下一篇: PAT甲级1114 Family Pro