1. 程式人生 > >題目1012:暢通工程(浙大)

題目1012:暢通工程(浙大)

最近在準備保研的機試題,從最開始什麼都不會,到現在可以寫出來一些簡單的題,這也算一個成長嘛,本科期間除了上課,做了幾個專案,沒怎麼接觸演算法的東西。如果有大一二的學妹學弟,如果有機會一定要參加參加ACM我覺得真的百利而無一害。我其實寫了挺多題了,只是都是寫在自己的印象筆記裡,感覺還是可以寫個部落格集合。直接看下面的題吧。

我的程式碼:
#include<iostream>
#include<set>

using namespace std;
//int a[1001][1001];
int b[1001];

int main(){
    int n,m;
    set<int
>
se; while(cin>>n>>m && n!=0){ for(int j=1;j<=n;j++){ b[j]=0; } int from,to; for(int i=0;i<m;i++){ cin>>from>>to; if(b[from]== 0 && b[to]==0){ b[from]=b[to]=from; }else
if(b[from] ==0 && b[to]!=0){ b[from]=b[to]; }else if(b[from] !=0 && b[to]==0) { b[to]=b[from]; }else if(b[from] !=0 && b[to]!=0 && b[from]!=b[to]){ int te=b[to]; for
(int i=1;i<=n;i++) if(b[i] == te) b[i]=b[from]; } } int count=0; //int i; for( int i=1;i<=n;i++){ if(b[i] != 0) se.insert(b[i]); else count++; // cout<<b[i]<<" "; } //cout<<endl; cout<<se.size()+count-1<<endl; se.clear(); } return 0; } 解題答案: #include <stdio.h> #define M 1000 int count = 0; int id[M+1]; void UF(int n) { for (int i=1; i<=n; i++) id[i] = i; } int find(int i) { return id[i]; } void combine(int i, int j, int n) { int a = find(i); int b = find(j); if (a == b) return ; for (int k=1; k<=n; k++) { if (id[k] == a) id[k] = b; } count--; } int main(void) { int m, n; int a, b; int i; while (scanf("%d", &n) != EOF && n) { scanf("%d", &m); count = n; UF(n); for (i=0; i<m; i++) { scanf("%d%d", &a, &b); combine(a, b, n); } printf("%d\n", count-1); } return 0; }