poj1094

来源:互联网 发布:mac装win7好不好 编辑:程序博客网 时间:2024/05/19 19:16
#include<stdio.h>#define max_vertex_num 26typedef 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;elsereturn 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;elsereturn 1;}

原创粉丝点击