2015藍橋杯決賽 關聯賬戶(並查集,水)
阿新 • • 發佈:2019-01-24
題目:
標題:關聯賬戶
為增大反腐力度,某地警方專門支隊,對若干銀行賬戶展開調查。
如果兩個賬戶間發生過轉賬,則認為有關聯。如果a,b間有關聯, b,c間有關聯,則認為a,c間也有關聯。
對於調查範圍內的n個賬戶(編號0到n-1),警方已知道m條因轉賬引起的直接關聯。
現在希望知道任意給定的兩個賬戶,求出它們間是否有關聯。有關聯的輸出1,沒有關聯輸出0
小明給出瞭如下的解決方案:
#include <stdio.h>
#define N 100
int connected(int* m, int p, int q)
{
return m[p]==m[q]? 1 : 0;
}
void link(int* m, int p, int q)
{
int i;
if(connected(m,p,q)) return;
int pID = m[p];
int qID = m[q];
for(i=0; i<N; i++) _____________________________________; //填空位置
}
int main()
{
int m[N];
int i;
for(i=0; i<N; i++) m[i] = i; //初始狀態,每個節點自成一個連通域
link(m,0,1); //新增兩個賬戶間的轉賬關聯
link(m,1,2);
link(m,3,4);
link(m,5,6);
link(m,6,7);
link(m,8,9);
link(m,3,7);
printf("%d ", connected(m,4,7));
printf("%d ", connected(m,4,5));
printf("%d ", connected(m,7,9));
printf("%d ", connected(m,9,2));
return 0;
}
請分析原始碼,並提交劃線部分缺少的程式碼。不要填寫已有程式碼或任何多餘內容。
思路:
我以為程式碼填空裡面只能填一句程式碼呢,知道這是並查集,沒見過這種寫法,這次算是長見識了
我根本不會想到在這一行裡懟一個if啊,雖然題很水,但我還是要寫個部落格
(是不是想象力夠,就能在這裡可以填好多行程式碼,反正c語言又不不像python那樣要求強制縮排,直接把所有程式碼懟一行不就行了麼)
WTF!!!這是一個填空?
填空:
if(m[i]==pID)m[i]=qID;