比赛 20140414 评测结果 AAAAWWWWWA
题目名称 路障 最终得分 50
用户昵称 Cirno 运行时间 0.020 s
代码语言 C++ 内存使用 0.55 MiB
提交时间 2014-04-14 11:20:54
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
int pa[251][251]={0};//pa[x][y]为x到y的邻接矩阵
int path[251]={0};
int fin=0,num;
int father[251]={0};
int N,M,x,y,val;
int i;
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)
{
	for(i=1;i<=N;i++)
	{
		if(i!=point)//不带自己
		{
			if(pa[point][i]!=0)//有边连接
			{
				if(!path[i])
					father[i]=point,path[i]=path[point]+pa[point][i],fin++;//首次发现
				if(path[point]+pa[point][i]<path[i])
					father[i]=point,path[i]=path[point]+pa[point][i];//更新值
			}
		}
	}
	view[point]=1;
	for(i=1;i<=N;i++)
	{
		if(i!=point)
			{if(pa[point][i]!=0&&view[i]!=1)//有边连接
				dij(i);
			}
	}
}
void dij1(int point)
{
	for(i=1;i<=N;i++)
	{
		if(i!=point)//不带自己
		{
			if(pa[point][i]!=0)//有边连接
			{
				if(!path[i])
					path[i]=path[point]+pa[point][i],fin++;//首次发现
				if(path[point]+pa[point][i]<path[i])
					path[i]=path[point]+pa[point][i];//更新值
			}
		}
	}
	view[point]=1;
	for(i=1;i<=N;i++)
	{
		if(i!=point)
			{if(pa[point][i]!=0&&view[i]!=1)//有边连接
				dij(i);
			}
	}
}
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);
		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);
	sum=path[N];
	findfather(N);
	out();
}