您的位置:首页 > 其它

Sorting It All Out(拓扑排序)

2013-08-15 21:26 316 查看
http://poj.org/problem?id=1094

1.判断所给关系是否为合法的拓扑序列,若存在环,输出

"Inconsistency found after %d relations."但仍继续输入。

2.判断是否可以确定序列,若不可以确定,继续输入,若可以确定输出

"Sorted sequence determined after %d relations: %s."后,继续输入数据。

3.若输入完数据仍不可以确定序列,输出"Sorted sequence cannot be determined.".

#include<stdio.h>
#include<string.h>
const int N=102;
int map

,in
,vis
;
int n,m,flag,top;
char s
;
void topo()
{
int cnt,i,j,pos;
top = 0;
int d
;//存每个点的度数
flag = 1;
memset(vis,0,sizeof(vis));
memcpy(d,in,n*sizeof(int));
for (i = 0; i < n; i ++)
{
cnt = 0;
for (j = 0; j < n; j ++)
{
if (d[j]==0)
{
cnt++;
pos = j;
}
}
if (cnt==0)//存在环
{
flag = 0;
return ;
}
if (cnt > 1)//不确定序列
{
flag = 2;
}
--d[pos];
s[top++] = pos+'A';
for (int k =  0; k < n; k ++)
{
if(map[pos][k]==1)
--d[k];//更新度数
}
}
s[top++] = '\0';

}
int main()
{
while(~scanf("%d%d%*c",&n,&m))
{
if (n==0 && m==0)
break;
flag = 0;
memset(in,0,sizeof(in));
memset(map,0,sizeof(map));
char a,b,c;
int i;
for (i = 1; i <= m; i ++)
{
scanf("%c%c%c%*c",&a,&b,&c);
if (flag)//控制输入
continue;
if (!map[a-'A'][c-'A'])
{
map[a-'A'][c-'A'] = 1;
in[c-'A']++;
}
topo();
if (flag==0)
{
flag = 1;//以便能继续输入下面的点
printf("Inconsistency found after %d relations.\n",i);
}
else if (flag==1)
{
printf("Sorted sequence determined after %d relations: %s.\n",i,s);
}
else if (flag==2)//无法确定序列,继续输入
{
flag = 0;//继续拓扑
}
}
if (flag==0)//输入完也无法确定序列
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: