1. 程式人生 > >洛谷 P2097 資料分發1

洛谷 P2097 資料分發1

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)    return
x; 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