您的位置:首页 > 其它

POJ 1094 最短路算法

2012-10-11 17:43 155 查看
正确算法应该为拓扑算法

不过我用最短路也过了

不知道是不是数据太小的问题

以后在用拓扑算法把他过了

题目简单

就一拓扑顺序的题
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 30
bool bnxt[M][M];
bool vis[M];
int g[M][M];
int n,m,to;
int ans[M],a[M];
const int FINISH=1,
		FAIL=2,
		NOANSWER=3;

void answer(int flag,int num)
{
	if(flag==FINISH)
	{
		int i,j;
		printf("Sorted sequence determined after %d relations: ",num);
		for(i=n-1;i>=0;i--)
		{
			for(j=0;j<n;j++)
			{
				if(g[j][to]==i)
				{
					putchar('A'+j);
				}
			}
		}
		printf(".\n");
	}
	else if(flag==FAIL)
	{
		printf("Inconsistency found after %d relations.\n",num);
	}
	else
	{
		printf("Sorted sequence cannot be determined.\n");
	}
}

bool judge()
{
	int i,j,k;
	bool allans=false;
	while(true)
	{
		bool bans=false;
    	for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				for(k=0;k<n;k++)
				{
					if(g[i][j]&&g[j][k]&&g[i][k]<g[i][j]+g[j][k])
					{
						bans=true;
						g[i][k]=g[i][j]+g[j][k];
						bnxt[i][k]=true;
						if(g[i][k]==n-1)
						{
							to=k;
							allans=true;
						}
					}
				}
			}
		}
    	if(!bans)
    	{
    		break;
    	}
	}
	if(allans)
	{
		return true;
	}
	return false;
}

void read()
{
	int i;
	char s[20];
	memset(bnxt,0,sizeof(bnxt));
	memset(g,0,sizeof(g));
	int nans=NOANSWER,step=0;
	for(i=0;i<n;i++)
	{
		a[i]=1;
	}
	for(i=1;i<=m;i++)
	{
		scanf("%s",s);
		if(nans!=NOANSWER)
		{
			continue ;
		}
		int u=s[0]-'A';
		int v=s[2]-'A';
		bnxt[u][v]=true;
		if(bnxt[v][u])
		{
			nans=FAIL;
			step=i;
		}
		else
		{
			g[u][v]=max(g[u][v],1);
			if(judge())
			{
				nans=FINISH;
				step=i;
			}

		}
	}
	answer(nans,step);
}
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		if(n==0&&m==0)
		{
			break;
		}
		read();
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: