HDU 4324 CODE[VS] 2066 triangle love(拓撲排序)

2066 三角戀
時間限制: 1 s
空間限制: 128000 KB
題目等級 : 鑽石 Diamond
題解
題目描述 Description
人們的戀愛關係與如下特點:兩個人a,b,如果a愛着b,那麼b一定不愛a;如果a不愛b,那麼b一定愛着a(yh的研究成果果然與衆不同……)。

現在,yh想知道,在n個人當中,是否存在三角戀現象(即a愛着b,b愛着c,c愛着a)。

輸入描述 Input Description
本題有多組測試數據

第一行一個整數t,表示有t組測試數據。

對於每組數據,第一行爲一個整數n,表示共有n人。

接下來爲n*n的0,1矩陣a,如果a[i,j]=1,則i愛着j,否則表示i不愛j;數據保證a[i,j]<>a[j,i]。

輸出描述 Output Description
每組數據輸出一行,如果存在三角戀,輸出’Yes’,否則輸出’No’。

樣例輸入 Sample Input
2

5

00100

10000

01001

11101

11000

5

01111

00000

01000

01100

01110

樣例輸出 Sample Output
Yes

No

數據範圍及提示 Data Size & Hint
對於40%的數據,n≤10

對於100%的數據,n≤2000, t≤5

思路:
對於兩個點,如果存在邊由點i指向點j,則一定不會存在邊由點j指向點i
拓撲排序是不斷刪除入度爲0的點的過程 也可以用來判環
只要所有點的入度都不爲零 那麼一定存在環
如果存在n元環(n >= 3)的話 就一定說明三角戀關係的存在
爲什麼呢??
首先一元環,這什麼鬼??自戀麼2333
二元環:題目裏面條件就已經否定了啊QAQ
三元環:嗯…就是這樣,a喜歡b,b喜歡c,c喜歡a,符合題意;
多元環:額….這肯定存在三元環的情況呀QwQ 有三元環就知道有三角戀了呢

代碼:

#include <cstdio>
#include <cstring>
int t,n;
int ru[2333];//存儲的是節點的入度
char mp[2333][2333];//存儲的是i,j兩個結點的關係,1:i love j,0:j love i
bool flag;//true表示爲有三角戀,false表示爲沒有三角戀
void init()
{
    flag = 0;
    memset(ru,0,sizeof(ru));//將所有的結點入度初始化爲0
}
int main()
{
    scanf("%d",&t);
    for(int i = 1; i <= t;i++)
    {
        scanf("%d",&n);
        init();
        for(int j = 0; j < n; j++)
        {
            scanf("%s",mp[j]);
            for(int k = 0;k < n;k ++)
            if(mp[j][k] == '1')//如果j喜歡k,則把k的入度加1
            ru[k] ++;
        }
        for(j = 0;j < n;j ++)
        {
            int k;
            for(k = 0;k < n;k ++)
            if(ru[k] = =0) break;//找出入度爲0的節點結點
            if(k == n)//任何一個結點的入度都不爲0,說明存在環了,則必有三角戀
            {
                flag = true;
                break;
            }
            else
            {
                //將這個點的入度設爲-1,避免再次循環時又查到了這個結點,
                //此時說明這個點已經從集合中除掉了
                ru[k] --;
                for(int l = 0;l < n;l ++)
                {
                    if(mp[k][l] == '1' && ru[l] != 0)
                    ru[l]--;//把從這個節點出發的引起的結點的入度都減去1
                }
            }
        }
        if(flag) puts("Yes");
        else puts("No");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章