1. 程式人生 > >2015藍橋杯決賽 關聯賬戶(並查集,水)

2015藍橋杯決賽 關聯賬戶(並查集,水)

題目:

標題:關聯賬戶

為增大反腐力度,某地警方專門支隊,對若干銀行賬戶展開調查。

如果兩個賬戶間發生過轉賬,則認為有關聯。如果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;