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;}