糟糕的网络
【问题描述】
前几天sqybi 还在高高兴兴的用BOINC 完成着一个又一个的任务呢,但现在sqybi 突然变得闷闷不乐起来。原因就是前一段时间的海底地震震断了光缆,导致了国外网站的整体瘫痪,而BOINC 的大部分工作的主站都是设在国外的。这样,sqybi 就不能从BOINC 下载到任务了,而他已经完成的任务也不能上传。
气愤的他打算自己找到在光缆断裂的时候最好的一条电缆替代线路。通过电流在电缆中传播的衰减公式(由汤姆逊博士发现),我们可以知道电缆之间的距离越远,那么电子衰
减的就越严重。所以,sqybi 想找到一条距离最短的电缆传输线路。
已知每一个电缆结点(就是说电缆数据在这个地方可以进行交换传输)的编号和它们之间的电缆分布情况,求出从0 结点指向n+1 结点最短的一条线路。
【输入格式】
第1 行是一个正整数n,表示电缆结点的数量(不包括0 结点和n+1 结点)。
第2 行是一个正整数m,表示电缆的数量。
接下来m 行,第i 行表示第i-2 条电缆的四个数,分别是整数L、x1、x2 和s,每两个数之间用一个空格分开。其中L 表示该条电缆的长度;当s 为1 的时候,这条电缆是从x1 结点指向x2 结点的一条单向电缆,而当s 为2 的时候,这条电缆是在x1 结点和x2 结点之间的一条双向电缆。
【输出格式】
仅一个数,为最短线路的长度。
【样例输入】
3
4
1 0 1 1
1 1 2 2
1 2 3 1
2 3 4 1
【样例输出】
5
【数据范围】
对于100%数据,n≤1000,m≤10000,1≤L≤1000。
【说明】
输入数据可能会有重复或者自己指向自己的情况,前者可以将重复的看作一条,后者应不考虑。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int dis[1001],h[1001],nxt[50001],val[50001],t[50001],cnt=0;
bool inq[1001];
int f,e,q[100001];
void addedge(int a,int b,int c)
{
cnt++;
t[cnt]=b;
val[cnt]=c;
nxt[cnt]=h[a];
h[a]=cnt;
}
int main()
{
freopen("network.in","r",stdin);
freopen("network.out","w",stdout);
cin >> n >> m;
memset(h,0,sizeof(h));
for(int i=1;i<=m;i++)
{
int l,x1,x2,s;
scanf("%d %d %d %d",&l,&x1,&x2,&s);
if(s==1) addedge(x1,x2,l);
else
{
addedge(x1,x2,l);
addedge(x2,x1,l);
}
}
memset(dis,-1,sizeof(dis));
memset(inq,0,sizeof(inq));
f=e=1;
q[1]=0,inq[0]=1,dis[0]=0;
while(f<=e)
{
int u=q[f++];
for(int p=h[u];p!=0;p=nxt[p])
{
int v=t[p],c=val[p];
if(dis[v]==-1||dis[v]>dis[u]+c)
{
dis[v]=dis[u]+c;
if(inq[v]==0)
{
inq[v]=1;
q[++e]=v;
}
}
}
inq[u]=0;
}
cout << dis[n+1] << endl;
return 0;
}