比赛 |
东方版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;
}
}
}