POJ 1094 Sorting It All Out(经典拓扑,唯一排序)
Description
Input
Output
Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.
where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.
Sample Input
4 6 A<B A<C B<C C<D B<D A<B 3 2 A<B B<A 26 1 A<Z 0 0
Sample Output
Sorted sequence determined after 4 relations: ABCD. Inconsistency found after 2 relations. Sorted sequence cannot be determined.
//很好的一道拓扑排序题目,
#include <iostream>
#include <stack>
#include <string.h>
#include <stdio.h>
#define N 33
using namespace std;
int main()
{ freopen("in.txt","r",stdin);
int i,j,n,m,t,record;
short int x,y;
bool e[N][N],use[N];
int v[N],tv[N],re[N];
char h[133],a,c,b;
bool f,f1,f2;
for(j=1,i='A';i<='Z';i++)
h[i]=j++;
stack<int>St;
while(scanf("%d%d",&n,&m),n||m)
{
while(!St.empty())
St.pop();
memset(v,0,sizeof(v));
memset(e,0,sizeof(e));
memset(use,0,sizeof(use));
getchar();t=0;
f1=f2=1;
for(i=1;i<=m;i++)
{
scanf("%c%c%c",&a,&c,&b);getchar();
if(f1==0||f2==0)
continue;
x=h[a];y=h[b];
if(!e[x][y])//确认加人的是条新边
{
if(!use[x])//确认该点是否出现过
{
t++;
use[x]=1;
}
if(!use[y])//确认该点是否出现过
{
t++;
use[y]=1;
}
e[x][y]=1;
v[y]++;//计算点的入度
for(j=1;j<=n;j++)
{ tv[j]=v[j];
if(use[j]&&!tv[j])//如果该点存在,且入度为0,则入栈。
St.push(j);
} f=1;
if(St.size()>1)//判断拓扑排序起点是否唯一
f=0;
int index=0;
while(!St.empty())
{
int temp=St.top();//拓扑起点
St.pop(); //删除该点
re[index++]=temp;
for(j=1;j<=n;j++)
{
if(e[temp][j])
{
tv[j]--; //删除以该点为起始的有向边
if(!tv[j])
St.push(j);
}
}
if(St.size()>1)//判断拓扑排序起点是否唯一
f=0;
}
for(j=1;j<=n;j++)
if(tv[j]) //说明存在环了
{
f1=0;record=i;
break;
}
if(t==n&&f&&f1)//开始时f1忘记加进来了,有环时就不再往下做了。
{
f2=0;record=i;
continue;
}
}
}
if(!f2)
{
printf("Sorted sequence determined after %d relations: ",record);
for(i=0;i<n;i++)
printf("%c",re[i]+64);
printf(".\n");
}else if(!f1)
{
printf("Inconsistency found after %d relations.\n",record);
}else
{
printf("Sorted sequence cannot be determined.\n");
}
}
return 0;
}
//今天再次看了下Bellman Ford 算法,理解加深了些了!
时隔几个月、再次写下这题
#include <iostream>
#include <stdio.h>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;
char rc[29];
int temp[29];
int in[29];
vector<int> ve[29];
int n,cnt;
int topsort()
{
stack<int> S;
int i,id=0;
bool f=1;
for(i=0;i<n;i++)
{
temp[i]=in[i];
if(in[i]==0)
S.push(i);
}
if(S.size()>1) f=0;
int d,l;
while(!S.empty())
{
d=S.top();S.pop();
rc[id++]=(char)d+'A';
for(l=ve[d].size(),i=0;i<l;i++)
if(--temp[ve[d][i]]==0)
S.push(ve[d][i]);
if(S.size()>1) f=0;
}
rc[id]='\0';
for(i=0;i<n;i++) if(temp[i]) return -1;
if(f&&id==n) return 1;
return 0;
}
int main()
{
int m,i;
char op[5];
int a,b;
int flag,p,k;
while(scanf("%d %d",&n,&m),n)
{
memset(in,0,sizeof(in));
cnt=p=k=0;
for(i=0;i<m;i++)
{
scanf("%s",op);
a=op[0]-'A';
b=op[2]-'A';
//if(ve[a].size()==0) cnt++;
// if(ve[b].size()==0) cnt++;
ve[a].push_back(b);
in[b]++;
if(p==0) flag=topsort();
if(p==0)
{
if(flag==-1)
{
k=i+1;
p=-1;
}
if(flag==1)
{
k=i+1;
p=1;
}
}
}
if(p==1)
printf("Sorted sequence determined after %d relations: %s.\n",k,rc);
else if(p==0)
printf("Sorted sequence cannot be determined.\n");
else
printf("Inconsistency found after %d relations.\n",k);
for(i=0;i<n;i++) ve[i].clear();
}
return 0;
}
浙公网安备 33010602011771号