比赛 东方版NOIP模拟赛 评测结果 AAAAAAAAAAAAAATTAATT
题目名称 Yuyuko 最终得分 80
用户昵称 Kt820 运行时间 16.343 s
代码语言 C++ 内存使用 3.51 MiB
提交时间 2015-10-28 21:19:02
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
#define maxm 200010
#define maxn 30005
#define inf (1<<30)
using namespace std;
int tot,len[maxm],end[maxm],last[maxm],next[maxm],N,M,dis[maxn];
bool mark[maxn];
void add(int x,int y,int w)
{
	len[++tot]=w;
	end[tot]=y;
	next[tot]=last[x];
	last[x]=tot;
}
void spfa(int s)
{
	int i,t;
	queue<int>Q;
	for(i=1;i<=N;i++)
	{
		dis[i]=inf;
		mark[i]=0;
	}
	Q.push(s);dis[s]=0;mark[s]=1;
	while(!Q.empty())
	{
		t=Q.front();mark[t]=0;Q.pop();
		for(i=last[t];i;i=next[i])
		{
			if(dis[end[i]]>dis[t]+len[i])
			{
				dis[end[i]]=dis[t]+len[i];
				if(!mark[end[i]])
				{
					mark[end[i]]=1;
					Q.push(end[i]);
				}
			}
		}
	}
}
int main()
{
	freopen("zaw.in","r",stdin);
	freopen("zaw.out","w",stdout);
	int i,j,x,y,w,ww,len1n=inf,lenn1=inf,a,b;
	scanf("%d%d",&N,&M);
	for(i=1;i<=M;i++)
	{
		scanf("%d%d%d%d",&x,&y,&w,&ww);
//		if((x==1)&&(y==N))len1n=w,lenn1=ww;
//		else if((x==N)&&(y==1))len1n=ww,lenn1=w;
		
		
			add(x,y,w);
			add(y,x,ww);
		
	}
	bool flag=1;
	int ans=inf;
	for(a=last[1];a;a=next[a])
	{
		int t=len[a],tt;
//		printf("==%d==\n",end[a]);
		len[a]=inf;
		for(b=last[end[a]];b;b=next[b])
			if(end[b]==1)
			{
				tt=len[b];
				break;
			}
		len[b]=inf;
		spfa(1);
	//	for(a=1;a<=N;a++)printf("-%d- ",dis[a]);
//		putchar(10);
//		printf("-%d %d-%d\n",end[a],tt,t);
		ans=min(dis[end[a]]+tt,ans);
		len[a]=t;len[b]=tt;
	}
		
//	printf("-%d-\n",dis[N]);
//	dis[N]+=lenn1;
//	ans=min(ans,dis[N]);
//	flag=1;
	//spfa(N);
//	dis[1]+=lenn1;
//	ans=min(ans,dis[1]);
	if(ans>=inf)puts("-1");
	else printf("%d\n",ans);
	return 0;
}