比赛 东方版NOIP模拟赛 评测结果 WWAWWWWWAWWWAWWAAWWW
题目名称 Yuyuko 最终得分 25
用户昵称 明天 运行时间 3.087 s
代码语言 C++ 内存使用 2.97 MiB
提交时间 2015-10-28 20:52:29
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <climits>
using namespace std;

struct node
{
	int x,w,next;
};

const int maxn=30000+1;
const int maxm=100000+1;
int n,m;

int h[maxn];
node table[maxm*2];
int len;

int q[maxn+1];
int front,tail;
bool v[maxn];
int d[maxn];
int ans;

void add1(int i,int j,int w);
void spfa(int s);
int main()
{
	freopen("zaw.in","r",stdin);
	freopen("zaw.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	for (int k=0; k<m; k++)
	{
		int i,j,w1,w2;
		scanf("%d%d%d%d",&i,&j,&w1,&w2);
		add1(i,j,w1); add1(j,i,w2);
	}
	
	ans=INT_MAX;
	spfa(1);
	
	if (ans==INT_MAX)
		cout<<-1<<endl;
	else
		cout<<ans<<endl;
	return 0;
}
void add1(int i,int j,int w)
{
	len++;
	table[len].x=j; table[len].w=w; table[len].next=h[i];
	h[i]=len;
}
void spfa(int s)
{
	for (int i=1; i<=n; i++)
	{
		d[i]=INT_MAX/2;
	}
	front=0; tail=1;
	q[tail]=s; v[s]=true; d[s]=0;
	while (front!=tail)
	{
		front=(front+1)%maxn;
		int x=q[front];
		v[x]=false;
		int p=h[x];
		while (p!=0)
		{
			int y=table[p].x;
			if (y==s)
			{
				int q=h[s];
				bool flag=true;
				while (q!=0)
				{
					if(table[q].x==x && d[table[q].x]==table[q].w)
					{
						flag=false; break;
					}
					q=table[q].next;
				}
				if (flag)
					ans=d[x]+table[p].w;
			}
			if (d[x]+table[p].w<d[y])
			{
				d[y]=d[x]+table[p].w;
				if (!v[y])
				{
					v[y]=true;
					tail=(tail+1)%maxn;
					q[tail]=y;
				}
			}
			p=table[p].next;
		}
	}
}