比赛 20140414 评测结果 AAAAAAAWWA
题目名称 路障 最终得分 80
用户昵称 ◆半城烟沙灬為你打天下 运行时间 0.017 s
代码语言 C++ 内存使用 1.35 MiB
提交时间 2014-04-14 11:20:16
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
struct sky
{
	int ff,tt,ww,next;
};
sky c[50050];
int d[5000],d1[5000],d2[5000],heap[5000],r[50050];
bool v[5000];
int m,n,tot,st,ed,ans;
int top=0,x,y,z;
void add(int x,int y,int w)
{
	tot++;
	c[tot].ff=x;
	c[tot].tt=y;
	c[tot].ww=w;
	c[tot].next=r[x];
	r[x]=tot;
}

void up(int x)
{
	while (x>>1)
	{
    	if (d[heap[x]]<d[heap[x>>1]])
		{
      		swap(heap[x],heap[x>>1]);
      		x>>=1;
      	}
    	else
		{
      		return;
    	}
  	}
}
void down(int x)
{
	int p=x<<1;
  	while (p<=top)
	{
		if (p<top&&d[heap[p]]>d[heap[p+1]])
		{
			p++;
    	}
    	if (d[heap[x]]>d[heap[p]])
		{
      		swap(heap[x],heap[p]);
      		x=p;
      		p=x<<1;
    	}
    	else
		{
      		return;
    	}
  	}
}
void DJ()
{
	memset(d,0x3f3f3f3f,sizeof(d));
  	memset(v,0,sizeof(v));
  	top=1;
  	d[st]=0;
  	heap[1]=st;
  	int now=0;
  	while (top)
	{
		now=heap[1];
    	heap[1]=heap[top];
    	top--;
    	down(1);
    	for (int x=r[now];x;x=c[x].next)
		{
			if (d[c[x].tt]>d[now]+c[x].ww)
			{
				d[c[x].tt]=d[now]+c[x].ww;
        		if (!v[c[x].tt])
				{
          			v[c[x].tt]=1;
          			top++;
          			heap[top]=c[x].tt;
          			up(top);
        		}       
      		}
    	}
  	}
}
int main()
{
	freopen("rblock.in","r",stdin);
	freopen("rblock.out","w",stdout);
	scanf("%d%d",&n,&m);
	tot=1;
	memset(r,0,sizeof(r));
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	st=n;ed=1;
	DJ();
	for (int i=1;i<=n;i++)
	{
		d2[i]=d[i];
	}
	st=1;ed=n;
	DJ();
	for (int i=1;i<=n;i++)
	{
    	d1[i]=d[i];
    }
	ans=0;int a=d[n];
	for (int i=1;i<=tot;i++)
	{
    	if (d1[c[i].ff]+c[i].ww+d2[c[i].tt]==a)
		{
      		c[i].ww<<=1;
      		DJ();
      		ans=max(ans,d[n]-a);
      		c[i].ww>>=1;
    	}
  	}
	printf("%d\n",ans);
}