PAT L2-010 排座位(並查集)

L2-010. 排座位
時間限制
150 ms
內存限制
65536 kB
代碼長度限制
8000 B
判題程序
Standard
作者
陳越
佈置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程序告訴主人他們是否能被安排同席。

輸入格式:

輸入第一行給出3個正整數:N(<= 100),即前來參宴的賓客總人數,則這些人從1到N編號;M爲已知兩兩賓客之間的關係數;K爲查詢的條數。隨後M行,每行給出一對賓客之間的關係,格式爲:“賓客1 賓客2 關係”,其中“關係”爲1表示是朋友,-1表示是死對頭。注意兩個人不可能既是朋友又是敵人。最後K行,每行給出一對需要查詢的賓客編號。

這裏假設朋友的朋友也是朋友。但敵人的敵人並不一定就是朋友,朋友的敵人也不一定是敵人。只有單純直接的敵對關係纔是絕對不能同席的。

輸出格式:

對每個查詢輸出一行結果:如果兩位賓客之間是朋友,且沒有敵對關係,則輸出“No problem”;如果他們之間並不是朋友,但也不敵對,則輸出“OK”;如果他們之間有敵對,然而也有共同的朋友,則輸出“OK but…”;如果他們之間只有敵對關係,則輸出“No way”。

輸入樣例:
7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2
輸出樣例:
No problem
OK
OK but…
No way

並查集
思路很簡單
如果是朋友的話 找他們各自的最前驅節點(祖先節點) 如果不相同, 就進行何必, 即一個祖宗作爲另一個祖宗的孩子 Emmmm

code:

#include <iostream>
using namespace std;
int F[105];
int Mp[105][105];

int find(int x)
{
    int r=x;
    while (F[r ]!=r)
    r=F[r ] ;
    return  r ;
}
void join(int x,int y){
    int a = find(F[x]),b = find(F[y]);
    if(a != b)
        F[a] = b;
}

int main()
{
    int n,m,k;
    while(cin>>n>>m>>k){
        for(int i = 0;i <= n;i ++)  F[i] = i;
        int x,y,v;
        for(int i = 1;i <= m;i ++){
            cin>>x>>y>>v;
            Mp[x][y] = Mp[y][x] = v;
            if(v == 1)
                join(F[x],F[y]);
        }
        int judge1,judge2;
        for(int i = 1;i <= k;i ++){
            cin>>judge1>>judge2;
            if(Mp[judge1][judge2] == 1)  cout<<"No problem"<<endl;
            else if(Mp[judge1][judge2] == -1){
                if(find(F[judge1]) == find(F[judge2]))    cout<<"OK but..."<<endl;
                else
                    cout<<"No way"<<endl;
            }
            else
                cout<<"OK"<<endl;
        }
    }
    return 0;
}
發佈了268 篇原創文章 · 獲贊 296 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章