#include<stdio.h>
#define max_vertex_num 26
typedef struct
{
char vexs[max_vertex_num];
int arcs[max_vertex_num][max_vertex_num];
int vexnum,arcnum;
}adjmatrix;
void creatAdjlist(adjmatrix *g);
int locateVertex(adjmatrix *g,char v);
int potoSort(adjmatrix *g,char record[]);
int potoSort2(adjmatrix *g);
int main()
{
adjmatrix first;
while(1)
{
scanf("%d%d",&first.vexnum,&first.arcnum);
if(first.vexnum==0&&first.arcnum==0)
break;
else
creatAdjlist(&first);
}
return 0;
}
void creatAdjlist(adjmatrix *g)
{
int i,j,k,u,rec,flag,flag2,f;
char v1,v2,ch;
char record[max_vertex_num];
u=0;
f=0;
rec=-1;
for(i=0;i<g->vexnum;i++)
g->vexs[i]='A'+i;
for(i=0;i<g->vexnum;i++)
for(j=0;j<g->vexnum;j++)
g->arcs[i][j]=0;
for(i=0;i<g->arcnum;i++)
{
scanf(" %c%c%c",&v1,&ch,&v2);
j=locateVertex(g,v1);
k=locateVertex(g,v2);
g->arcs[j][k]=1;
flag2=potoSort2(g);
if(flag2==1)
{
flag=potoSort(g,record);
if(flag==1&&u==0)
{
rec=i;
f=1;
u++;
}
}
else
{
if(u==0)
{
rec=i;
u++;
}
}
}
if(flag2==0&&f!=1)
{
printf("Inconsistency found after %d relations.\n",rec+1);
}
else
{
if(flag==1)
{
printf("Sorted sequence determined after %d relations: ",rec+1);
for(i=0;i<g->vexnum;i++)
printf("%c",record[i]);
printf(".\n");
}
if(flag==0)
printf("Sorted sequence cannot be determined.\n");
}
}
int locateVertex(adjmatrix *g,char v)
{
int i;
for(i=0;i<g->vexnum;i++)
{
if(g->vexs[i]==v)
{
return i;
}
}
return -1;
}
int potoSort(adjmatrix *g,char record[])
{
int indegree[max_vertex_num],value,i,j,count,p,stack[max_vertex_num],k;
count=0;
p=-1;
for(i=0;i<g->vexnum;i++)
{
value=0;
for(j=0;j<g->vexnum;j++)
{
if(g->arcs[j][i]!=0)
value++;
}
indegree[i]=value;
if(indegree[i]==0)
{
stack[++p]=i;
}
}
if(p==0)
{
while(p!=-1)
{
k=stack[p--];
record[count]=g->vexs[k];
count++;
for(i=0;i<g->vexnum;i++)
{
if(g->arcs[k][i]!=0)
{
indegree[i]--;
if(indegree[i]==0)
stack[++p]=i;
}
}
if(p>0)
break;
}
}
if(count<g->vexnum)
return 0;
else
return 1;
}
int potoSort2(adjmatrix *g)
{
int indegree[max_vertex_num],value,i,j,count,p,stack[max_vertex_num],k;
count=0;
p=-1;
for(i=0;i<g->vexnum;i++)
{
value=0;
for(j=0;j<g->vexnum;j++)
{
if(g->arcs[j][i]!=0)
value++;
}
indegree[i]=value;
if(indegree[i]==0)
{
stack[++p]=i;
}
}
while(p!=-1)
{
k=stack[p--];
count++;
for(i=0;i<g->vexnum;i++)
{
if(g->arcs[k][i]!=0)
{
indegree[i]--;
if(indegree[i]==0)
stack[++p]=i;
}
}
}
if(count<g->vexnum)
return 0;
else
return 1;
}
poj1094
最新推荐文章于 2022-02-25 21:57:21 发布