比赛 东方版NOIP模拟赛 评测结果 AAAAAAAAAAAAAATAAATT
题目名称 Yuyuko 最终得分 85
用户昵称 一個人的雨 运行时间 13.679 s
代码语言 C++ 内存使用 7.66 MiB
提交时间 2015-10-28 20:15:17
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
const int inf=0x7fffffff/3;
const int maxn=100000+10;
int n,m,h[maxn],tot=0,cnt=0,ans;
struct edge{
	int to,next,w;
}G[maxn*5];
int dis[maxn],sty[maxn],stw[maxn];
bool vis[maxn];

void add(int x,int y,int z){
	G[++tot].to=y; G[tot].w=z;
	G[tot].next=h[x]; h[x]=tot;
}

void spfa(int pos,int x){
	deque<int>q; q.push_front(x);
	for (int i=1;i<=n;++i) dis[i]=inf,vis[i]=0;
	dis[x]=0; vis[x]=1; int u,v,w;
	while (!q.empty()){
		u=q.front(); q.pop_front(); vis[u]=0;
		for (int i=h[u];i;i=G[i].next){
			v=G[i].to; if (u==x&&v==1) continue;
			if (dis[u]+G[i].w<dis[v]){
				dis[v]=dis[u]+G[i].w;
				if (!vis[v]){
					vis[v]=1;
					if (!q.empty()&&dis[v]<dis[q.front()]) q.push_front(v);
					else q.push_back(v);
				}
			}
		}
	}ans=min(ans,dis[1]+stw[pos]);
}

int main(){
	freopen("zaw.in","r",stdin);
	freopen("zaw.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;++i){
		int x,y,a,b;
		scanf("%d%d%d%d",&x,&y,&a,&b);
		add(x,y,a); add(y,x,b);
		if (x==1||y==1){
			if (x==1){
			  sty[++cnt]=y;
			  stw[cnt]=a;
			}else{
				sty[++cnt]=x;
				stw[cnt]=b;
			}
		}
	}
	ans=inf;
	if (cnt==1){
		printf("-1");
		return 0;
	}
	for (int i=1;i<=cnt;++i){
		spfa(i,sty[i]);
	}if (ans==inf){
		printf("-1");
		return 0;
	}else printf("%d",ans);
}