标签:
http://poj.org/problem?id=1094
Description
Input
Output
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.
/**
poj 1094 拓扑排序
题目大意:
对于N个大写字母,给定它们的一些偏序关系,要求判断出经过多少个偏序关系之后可以确定它们的排序或者存在冲突,
或者所有的偏序关系用上之后依旧无法确定唯一的排序。
解题思路:(来自网上)
利用拓扑排序即可解决这个问题,但由于题目要求的是经过多少个关系之后就可以确定答案,因此每读入一个关系,
就要进行一次拓扑排序,如果某一次拓扑排序之后可以确定它们的唯一排序或者发现冲突存在,则后面的直接略过。
若读入所有关系之后依然无法确定唯一关系,同时也没有冲突,则输出不能确定唯一排序。若拓扑排序的过程中每次
仅有一个点入度为0,则该排序是可以确定的排序,否则若多个点入度为0,则不知道哪个点先哪个点后。若拓扑排序
进行到某一步之后无法再继续,则说明存在回路,此时说明存在冲突。
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=30;
int head[maxn],ip,indegree[maxn];
int n,m,seq[maxn];
struct note
{
int v,next;
} edge[maxn*maxn];
void init()
{
memset(head,-1,sizeof(head));
ip=0;
}
void addedge(int u,int v)
{
edge[ip].v=v,edge[ip].next=head[u],head[u]=ip++;
}
int topo()///拓扑,可做模板
{
queue<int>q;
int indeg[maxn];
for(int i=0; i<n; i++)
{
indeg[i]=indegree[i];
if(indeg[i]==0)
q.push(i);
}
int k=0;
bool res=false;
while(!q.empty())
{
if(q.size()!=1)res=true;
int u=q.front();
q.pop();
seq[k++]=u;
for(int i=head[u]; i!=-1; i=edge[i].next)
{
int v=edge[i].v;
indeg[v]--;
if(indeg[v]==0)
q.push(v);
}
}
if(k<n)return -1;///存在有向环或者图不连通,总之不能进行拓扑排序
if(res)return 0;///可以进行拓扑排序,并且只有唯一一种方式,seq数组即是排序完好的序列
return 1;///可以进行拓扑排序,有多种情况,seq数组是其中一种序列
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
init();
int ans=-1,err=-1;
memset(indegree,0,sizeof(indegree));
for(int i=0; i<m; i++)
{
char s[5];
scanf("%s",s);
if(ans!=-1||err!=-1)
continue;
int u=s[0]-'A';
int v=s[2]-'A';
addedge(u,v);
indegree[v]++;
int res=topo();
if(res==1)
ans=i+1;
else if(res==-1)
err=i+1;
}
if (ans != -1)
{
printf("Sorted sequence determined after %d relations: ", ans);
for (int i = 0; i < n; ++i)
putchar('A' + seq[i]);
printf(".\n");
}
else if (err != -1)
{
printf("Inconsistency found after %d relations.\n", err);
}
else
{
printf("Sorted sequence cannot be determined.\n");
}
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/43116929