记录编号 83369 评测结果 AAA
题目名称 [HAOI 2005]路由选择问题 最终得分 100
用户昵称 GravatarFrost 是否通过 通过
代码语言 C++ 运行时间 0.001 s
提交时间 2013-12-02 20:14:55 内存使用 0.33 MiB
显示代码纯文本
#include<iostream>
#include<fstream>
#define intmax 20000;
#include<cstring>
#include<algorithm>
using namespace std;
int map[51][51],dist[51],n,mi;
int start,end;
struct node
{
	int head;
};
node path[51];
void spfa(int s)
{
	int h=0,t=1;
	int v[51],q[51];
	for(int i=1;i<=n;++i)
	{
		dist[i]=intmax;
	}
	memset(q,0,sizeof(q));
	memset(v,0,sizeof(v));
	dist[s]=0;
	v[s]=1;
	q[t]=s;
	while(h!=t)
	{
		h=(h+1)%(n+1);
		int x=q[h];
		v[x]=0;
		for(int i=1;i<=n;++i)
		{
			if(dist[i]>dist[x]+map[x][i]&&map[x][i]!=0)
			{
				path[i].head=x;
				dist[i]=dist[x]+map[x][i];
				if(!v[i])
				{
					t=(t+1)%(n+1);
					q[t]=i;
					v[i]=1;
				}
			}
		}
	}
}
void dfs(int x)
{
	int b,c;
	if(x!=start)
	{
		b=path[x].head;
		c=map[x][b];
		map[x][b]=0;
		map[b][x]=0;
		spfa(start);
		map[x][b]=c;
		map[b][x]=c;
		mi=min(dist[end],mi);
		dfs(b);
	}
}
		
void printpath(int x)
{
	int b;
	if(x!=start)
	{
		b=path[x].head;
		printpath(b);
		cout<<b<<"->";
	}
}
int main()
{
	ifstream in("route.in");
	ofstream out("route.out");
	in>>n>>start>>end;
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			int c;
			in>>c;
			map[i][j]=c;
			map[j][i]=c;
		}
	}
	int m;
	in>>m;
	int x[m+1];
	for(int i=1;i<=m;++i)
	{
		in>>x[i];
	}
	spfa(start);
	int s1=dist[end];
	mi=intmax;
	dfs(end);
	for(int i=1;i<=m;++i)
	{
		for(int j=1;j<=n;++j)
		{
			map[j][x[i]]=0;
			map[x[i]][j]=0;
		}
	}
	spfa(start);
	out<<dist[end]<<" "<<s1<<" "<<mi<<endl;
	return 0;
}