记录编号 96722 评测结果 AAWAWWWWWA
题目名称 [USACO Feb14]路障 最终得分 40
用户昵称 GravatarCirno 是否通过 未通过
代码语言 C++ 运行时间 0.023 s
提交时间 2014-04-14 16:55:09 内存使用 0.56 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int pa[251][251]={0};//pa[x][y]为x到y的邻接矩阵
int path[251]={0};
int fin=0,num;
int bench[251]={0};
int father[251]={0};
int N,M,x,y,val,k;
int i;
int ben;
int sum=0;
int ans=0;
int fath=0;
bool view[251]={0};
void init()
{
	freopen("rblock.in","r",stdin);
	cin>>N>>M;
	for(i=1;i<=M;i++)
	{	
		cin>>x>>y>>val,pa[x][y]=val,pa[y][x]=val;
	}
}
void dij(int point,int fa)
{
	for(i=1;i<=N;i++)
	{
		if(i!=point)//不带自己
		{
			if(pa[point][i]!=0)//有边连接
			{
				if(!path[i]||path[point]+pa[point][i]<path[i])
					{father[i]=point;path[i]=path[point]+pa[point][i];}//首次发现/更新值
			}
		}
	}
	view[point]=1;
	k=0;
	for(i=1;i<=N;i++)
		if(i!=point&&view[i]==0&&path[i]!=0)
			bench[k]=i,k++;
	sort(bench,bench+k);
	for(i=k-1;i>=0;i--)
		dij(bench[i],point);
}
void dij1(int point,int fa)
{
	for(i=1;i<=N;i++)
	{
		if(i!=point)//不带自己
		{
			if(pa[point][i]!=0)//有边连接
			{
				if(!path[i]||path[point]+pa[point][i]<path[i])
					path[i]=path[point]+pa[point][i];//首次发现/更新值
			}
		}
	}
	view[point]=1;
	k=0;
	for(i=1;i<=N;i++)
		if(i!=point&&view[i]==0&&path[i]!=0)
			bench[k]=i,k++;
	sort(bench,bench+k);
	for(i=k-1;i>=0;i--)
		dij1(bench[i],point);
}
void ke()
{
	for(i=1;i<=250;i++)
		path[i]=0,view[i]=0;
	path[1]=0;
}
void findfather(int point)
{
	if(point!=1)
	{
		fath=father[point];
		pa[fath][point]*=2,pa[point][fath]*=2;
		ke();
		dij1(1,0);
		ans=max(ans,path[N]-sum);
		pa[fath][point]/=2,pa[point][fath]/=2;
	findfather(fath);
	}
	return;
}
void out()
{
	freopen("rblock.out","w",stdout);
	cout<<ans<<endl;
}
int main()
{
	init();
	path[1]=0;
	dij(1,0);
	sum=path[N];
	findfather(N);
	out();
}