排序(拓撲排序)

排序

1000ms
65535KB
64-bit integer IO format: %lld      Java class name: Main
Font Size:
Type:
排序是計算機程序設計中最常用的操作之一,通常都是通過比較操作來完成排序。我們知道,要對一組整數進行排序,只要把它們兩兩進行一次比較,肯定能夠完成。但是,其實這麼多次比較並不都是必要的,例如,對A、B、C三個數進行排序,如果通過比較得到A>B、B>C,那麼A和C之間的比較就是完全沒有必要的了。
所以,我們常常只需要一部分比較結果,就能完成排序操作。現在已知一些比較的結果,請你判斷一下利用這些結果能否完成排序。注意,不能完成排序可能是比較結果所提供的信息不足,也可能是比較結果之間是矛盾的。

Input

輸入包括多組數據,每組數據第一行爲兩個整數n和m(2 ≤ n ≤ 100,1 ≤ m ≤ 10000)。n表示需要排序的整數的個數,m表示已經進行的比較操作的次數。以下m行每行有兩個整數i、j(1 ≤ i, j ≤ n),表示第i個整數和第j個整數比較的結果是i > j。
每兩組輸入之間間隔一個空行。
如果n = m = 0則表示輸入結束。

Output

每個答案輸出一行,如果用已有的比較信息能夠完成排序,則輸出“Yes”,否則請輸出“No”。

Sample Input

3 2
1 2
2 3

3 2
1 2
1 3

2 2
1 2
2 1

0 0

Sample Output

Yes
No
No
拓撲排序模板

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int s[110][110];
int n,m;
bool toposort(int s[][110])
{
    int i,j,k,l;
    int into[110];
    memset(into,0,sizeof(into));
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(s[i][j]>0)
            {
                into[j]++;
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        j=1;
        while(into[j]!=0)
        {
            j++;
            if(j>n)
            {
                return false;
            }
        }
        k=j+1;
        for(l=k;l<=n;l++)
        {
            if(into[l]==0)
            {
                return false;
            }
        }
        into[j]=-1;
        for(l=1;l<=n;l++)
        {
            if(s[j][l]>0)
            {
                into[l]--;
            }
        }
    }
    return true;
}
int main()
{
    int i,a,b,flag=0;
    while(cin>>n>>m,n+m)
    {
        flag++;
        memset(s,0,sizeof(s));
        for(i=1;i<=m;i++)
        {
            cin>>a>>b;
            s[a][b]=1;
        }
        if(toposort(s))
        {
            cout<<"Yes"<<endl;
        }
        else
        {
            cout<<"No"<<endl;
        }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章