比赛 |
东方版NOIP模拟赛 |
评测结果 |
AAAAAAAAATAAAATATTTT |
题目名称 |
Yuyuko |
最终得分 |
70 |
用户昵称 |
Neptune |
运行时间 |
26.791 s |
代码语言 |
C++ |
内存使用 |
1.38 MiB |
提交时间 |
2015-10-28 19:34:14 |
显示代码纯文本
#include<stdio.h>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct node {int x,s;};
int n,m;
int dis[30010],mark[30010];
vector <node> ns[30010];
vector <int> marki[30010];
queue <int> q;
int N;
int father[30010],ans[30010],haha=2100000000;
void clear(int x)
{
for(int i=1;i<=n;i++)
dis[i]=1500000000;
dis[x]=0;
}
void clearmarki()
{
for(int i=1;i<=n;i++)
if(marki[i].size())
marki[i].clear();
}
int check(int x,int y)
{
for(int i=0;i<marki[x].size();i++)
{
if(marki[x][i]==y)return 1;
}
return 0;
}
int SPFA(int x,int y)
{
clear(x);
q.push(x);
mark[x]=1;
while(!q.empty())
{
N=q.front();
q.pop();
mark[N]=0;
for(int i=0;i<ns[N].size();i++)
{
if(check(N,ns[N][i].x))continue;
if(dis[ns[N][i].x]>dis[N]+ns[N][i].s)
{
if(y)father[ns[N][i].x]=N;
dis[ns[N][i].x]=dis[N]+ns[N][i].s;
if(!mark[ns[N][i].x])
{
mark[ns[N][i].x]=1;
q.push(ns[N][i].x);
}
}
}
}
return 0;
}
node shit;
void insert(int x,int y,int z)
{
shit.x=y;
shit.s=z;
ns[x].push_back(shit);
}
void search(int x)
{
if(father[x]==x)return ;
marki[x].push_back(father[x]);
marki[father[x]].push_back(x);
search(father[x]);
return ;
}
int main()
{
freopen("zaw.in","r",stdin);
freopen("zaw.out","w",stdout);
int x1,x2,x3,x4;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d %d %d",&x1,&x2,&x3,&x4);
insert(x1,x2,x3);
insert(x2,x1,x4);
}
for(int i=1;i<=n;i++)
father[i]=i;
SPFA(1,1);
for(int i=2;i<=n;i++)ans[i]=dis[i];
for(int i=2;i<=n;i++)
{
if(ans[i]!=1500000000)
{
clearmarki();
search(i);
SPFA(i,0);
if(dis[1]==1500000000)continue;
haha=min(haha,ans[i]+dis[1]);
}
}
if(haha!=2100000000)printf("%d",haha);
else printf("-1");
}