比赛 东方版NOIP模拟赛 评测结果 TTWETTTTTTWWEWEWETTT
题目名称 Yuyuko 最终得分 0
用户昵称 高哥 运行时间 44.919 s
代码语言 C++ 内存使用 6.16 MiB
提交时间 2015-10-28 21:08:15
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
#define N 30050
#define M 100500
#define inf 2000000000
using namespace std;
int n,m,d[N],p[N],dist[N];
bool vis[N],vise[M];
struct Edge{
	int from,to,dist;
};
vector<Edge> edges;
vector<int> g[N];
struct node{
	int x,d;
	bool operator < (const node& rhs)const{
		return d>rhs.d;
	}
};
priority_queue<node> que;
set<int> f[N];
void add(int u,int v,int w)
{
	edges.push_back((Edge){u,v,w});
	g[u].push_back(edges.size()-1);
}
void input()
{
	scanf("%d%d",&n,&m);
	int u,v,w1,w2;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d%d",&u,&v,&w1,&w2);
		add(u,v,w1);
		add(v,u,w2);
	}
}
void init()
{
	memset(vis,false,sizeof(vis));
	for(int i=0;i<=n;i++)
	  d[i]=inf;
	memset(vise,false,sizeof(vise));
}
void djs(int t)
{
	init();
	int x=t;
	while(x!=1)
	{
		int o=p[x];
		vise[o^1]=vise[o]=true;
		x=edges[o].from;
	}
	d[t]=0;
	que.push((node){t,0});
	while(!que.empty())
	{
		node x=que.top();
		que.pop();
		int u=x.x;
		if(vis[u]) continue;
		vis[u]=true;
		for(int i=0;i<g[u].size();i++)
		{
			if(vise[g[u][i]]) continue;
			Edge& e=edges[g[u][i]];
			if(d[e.to]>d[u]+e.dist)
			{
				d[e.to]=d[u]+e.dist;
				p[e.to]=g[u][i];
				que.push((node){e.to,d[e.to]});
			}
		}
	}
}
int main()
{
	freopen("zaw.in","r",stdin);
	freopen("zaw.out","w",stdout);
	int ans=inf;
	input();
	djs(1);
	for(int i=2;i<=n;i++)
	{
	  dist[i]=d[i];
	  djs(i);
	  ans=min(dist[i]+d[1],ans);
	}
	if(ans>=inf)
	  printf("-1\n");
	else
	  printf("%d\n",ans);
	return 0;
}