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