记录编号 131534 评测结果 AAA
题目名称 [HAOI 2005]路由选择问题 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.001 s
提交时间 2014-10-24 17:00:44 内存使用 0.33 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
queue<int> A;
bool pan[51]={0},qwq;
int n,to[51][51]={0},street[51][51]={0},zui[51]={0},rezui[51][2]={0},cofr[51]={0},i,j,zj1,zj2,zj3,p,fr,en,s0,s1,s2;
void init()
{
	scanf("%d%d%d",&n,&fr,&en);
	for(i=1;i<=n;i++)
	for(p=1;p<=n;p++)
	{
		scanf("%d",&zj1);
		if(zj1)
		{
			to[i][0]++;
			to[i][ to[i][0] ]=p;
			street[i][p]=zj1;
		}
	}
	scanf("%d",&zj2);
	for(i=1;i<=zj2;i++)
	{
		scanf("%d",&zj1);
		pan[zj1]=true;
	}
}
void s0work()
{
	for(i=1;i<=n;i++)zui[i]=0x7fffffff;
	zui[fr]=0;
	for(i=1;i<=to[fr][0];i++)
	if(!pan[ to[fr][i] ])
	{
		A.push(to[fr][i]);
		zui[ to[fr][i] ]=street[fr][ to[fr][i] ];
	}
	while(!A.empty())
	{
		zj1=A.front();A.pop();
		for(i=1;i<=to[zj1][0];i++)
		if(!pan[ to[zj1][i] ])
		{
			zj2=zui[zj1]+street[zj1][ to[zj1][i] ];
			if(zj2<zui[ to[zj1][i] ])
			{
				zui[ to[zj1][i] ]=zj2;
				A.push(to[zj1][i]);
			}
		}
	}
	s0=zui[en];
}
void s1ands2work()
{
	for(i=1;i<=n;i++)rezui[i][0]=rezui[i][1]=1000000;
	rezui[fr][1]=0;
	A.push(fr);
	while(!A.empty())
	{
		zj1=A.front();A.pop();
		for(i=1;i<=to[zj1][0];i++)
		{
			qwq=false;
			zj2=rezui[zj1][1]+street[zj1][ to[zj1][i] ];
			zj3=rezui[zj1][0]+street[zj1][ to[zj1][i] ];
			if(zj2<rezui[ to[zj1][i] ][1])
			{
				rezui[ to[zj1][i] ][0]=rezui[ to[zj1][i] ][1];//更新第二小的值 
				rezui[ to[zj1][i] ][1]=zj2;//更新最小值 
				cofr[ to[zj1][i] ]=zj1;//记录转移点 
				if(zj3<rezui[ to[zj1][i] ][0]) rezui[ to[zj1][i] ][0]=zj3;
				qwq=true;
			}
			else//第二小的更新 
			if(zj2<rezui[ to[zj1][i] ][0]&&cofr[ to[zj1][i] ]!=zj1)
			{
				rezui[ to[zj1][i] ][0]=zj2;
				qwq=true;
			}
			if(qwq)//假如更新过,则此点入队
			A.push(to[zj1][i]); 
		}
	}
	s1=rezui[en][1];
	s2=rezui[en][0];
}
int main()
{
	freopen("route.in","r",stdin);
	freopen("route.out","w",stdout);
	init();
	s0work();
	s1ands2work();
	printf("%d %d %d\n",s0,s1,s2);
	return 0;
}