题目链接:http://poj.org/problem?id=1094
题目大意:N个节点,给M次排序关系。能否确定排序关系。
解题思路:这道题中,如果当前给出的条件已经能够排序关系或者判定顺序关系矛盾,则之后给出的顺序关系可以不处理。因此没给定一个条件,就进行一次拓扑排序。
代码如下:
/*********************************************************************
FileName: 1094.cpp
Author: wing
Created Time: 2014年07月27日 星期日 14时34分16秒
*********************************************************************/
#include<queue>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define FFF 30
int n,m;
char s[23];
int ans[27];
int cnt[27];
bool can;
int first[27],next[1005],v[1005],e;
queue<int> p;
void addedge(int x,int y)
{
v[e]=y;
next[e]=first[x];
first[x]=e++;
}
bool paixu()
{
while(!p.empty())p.pop();
int now=0;
bool vis[27];
memset(vis,false,sizeof(vis));
int cc[27];
for(int i=0;i<n;i++)
cc[i]=cnt[i];
for(int i=0;i<n;i++)
{
if(cc[i]==0)
{
ans[now++]=i;
p.push(i);
}
}
bool flag=true;
while(!p.empty())
{
if(p.size()>1)flag=false;
int t=p.front();p.pop();
for(int k=first[t];k!=-1;k=next[k])
{
cc[v[k]]--;
if(cc[v[k]]==0)
{
ans[now++]=v[k];
p.push(v[k]);
}
}
}
if(now<n)
{
can=false;
return true;
}
if(flag)
return true;
return false;
}
bool solve(int x)
{
can=true;
int t1=s[0]-'A';
int t2=s[2]-'A';
addedge(t1,t2);
cnt[t2]++;
if(paixu())
{
if(can)
{
printf("Sorted sequence determined after %d relations: ",x);
for(int i=0;i<n;i++)
printf("%c",ans[i]+'A');
printf(".\n");
}
else
{
printf("Inconsistency found after %d relations.\n",x);
}
return true;
}
else
return false;
}
int main()
{
bool flag;
while(cin>>n>>m)
{
e=0;
if(n+m==0)break;
flag=false;
memset(cnt,0,sizeof(cnt));
memset(first,-1,sizeof(first));
for(int i=0;i<m;i++)
{
cin>>s;
//cout<<" s="<<s<<endl;
if(!flag)
flag=solve(i+1);
}
if(flag==false)
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}