poj1094

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

	
			
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值