題目1012:暢通工程(浙大)
阿新 • • 發佈:2019-01-28
最近在準備保研的機試題,從最開始什麼都不會,到現在可以寫出來一些簡單的題,這也算一個成長嘛,本科期間除了上課,做了幾個專案,沒怎麼接觸演算法的東西。如果有大一二的學妹學弟,如果有機會一定要參加參加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;
}