洛谷 P2097 資料分發1
阿新 • • 發佈:2017-11-19
ack ++ tin using copy %d 2個 get ret
說明
P2097 資料分發1
題目描述
有一些電腦,一部分電腦有雙向數據線連接。如果一個電腦得到數據,它可以傳送到的電腦都可以得到數據。現在,你有這個數據,問你至少將其輸入幾臺電腦,才能使所有電腦得到數據。
輸入輸出格式
輸入格式:
第一行兩個數n,m。n是點數,m是邊數。
接下來m行,每行2個整數p,q表示p到q有一條雙向數據線。
輸出格式:
一個整數,表示至少輸入的電腦數量。
輸入輸出樣例
輸入樣例#1: 復制4 5
1 2
1 3
2 3
2 1
3 4
輸出樣例#1: 復制
1
說明
對於30%的數據:n<=100,m<=1000
對於60%的數據:n<=2000,m<=100000
對於100%的數據:n<=100000, m<=200000
數據不保證沒有重邊,不保證沒有自回環
思路:並茶幾
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m,ans; int fa[100010],vis[100010]; int find(int x){ if(fa[x]==x) returnx; else return fa[x]=find(fa[x]); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); int dx=find(u); int dy=find(v); if(dx==dy) continue; fa[dx]=dy; } for(int i=1;i<=n;i++) if(!vis[find(i)]){ ans++; vis[fa[i]]=1; } cout<<ans; }
洛谷 P2097 資料分發1