pku 1094 Sorting It All Out
本文正體字版由OpenCC轉換
基本方法是拓撲排序,非常容易錯。首先逐條讀入關係,每讀入一個關係,進行一次拓撲排序。拓撲排序可能返回三種結果,有確定唯一的順序,無法確定唯一的順序,有矛盾(存在環)。注意只要一但確定了唯一的順序,立刻判定輸出,即使後面的條件有矛盾也要忽略了。 例如下面數據 2 2 A<B B<A
答案是Sorted sequence determined after 1 relations: AB.
有一些需要注意的細節,在拓撲排序中,判斷存在環的優先級要高於無法確定唯一的順序的優先級。例如下面數據 4 4 A<B C<B D<B B<A 0 0
答案是Inconsistency found after 1 relations.
還有就是多組測試數據變量一定要清零,我就是因爲沒有清零錯誤了好幾次。
/*
* Problem: pku1094 Sorting It All Out
* Author: Guo Jiabao
* Time: 2009.4.7 10:41
* State: Solved
* Memo: 拓撲排序
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
const int MAXN=27;
using namespace std;
int N,M;
bool adjm[MAXN][MAXN];
int ind[MAXN];
char order[MAXN];
int topsort()
{
int k,i,j;
bool det=true;
memset(ind,0,sizeof(ind));
memset(order,0,sizeof(order));
for (i=1;i<=N;i++)
for (j=1;j<=N;j++)
if (adjm[i][j])
ind[j]++;
for (k=1;k<=N;k++)
{
i=0;
for (j=1;j<=N;j++)
if (ind[j]==0)
{
if (i==0)
i=j;
else
det=false;
}
if (i==0)
return 1;
ind[i]=-1;
order[k-1]=i+'A'-1;
for (j=1;j<=N;j++)
if (adjm[i][j])
ind[j]--;
}
if (det)
return 0;
else
return 2;
}
void solve()
{
int i,a,b,rs,sure=false;;
char C[4];
memset(adjm,0,sizeof(adjm));
for (i=1;i<=M;i++)
{
scanf("%s",&C);
a=C[0]-'A'+1;b=C[2]-'A'+1;
if (sure) continue;
adjm[a][b]=true;
rs=topsort();//0確定唯一 1矛盾 2不唯一/不完全
if (rs==0)
{
printf("Sorted sequence determined after %d relations: %s.n",i,order);
sure=true;
}
else if (rs==1)
{
printf("Inconsistency found after %d relations.n",i);
sure=true;
}
}
if (!sure)
printf("Sorted sequence cannot be determined.n");
}
int main()
{
freopen("siao.in","r",stdin);
freopen("siao.out","w",stdout);
while (scanf("%d%d",&N,&M),!(N==0 && M==0))
solve();
return 0;
}
上次修改時間 2017-02-03