排序
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則表示輸入結束。
每兩組輸入之間間隔一個空行。
如果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;
}