caioj 1088 最短路模板

来源:互联网 发布:百度人口迁徙数据 编辑:程序博客网 时间:2024/06/06 01:18
【题意】
给出一个图,起始点是1,结束点是N,边是双向的。求点1到点N的最短距离。哈哈,这就是标准的最短路径问题。 
【输入格式】
第一行为两个整数N(1≤N≤10000)和M(0≤M≤200000)。N表示图中点的数目,M表示图中边的数目。
下来M行,每行三个整数x,y,c表示点x到点y之间存在一条边长度为c。(x≠y,1≤c≤10000)
【输出格式】
输出一行,一个整数,即为点1到点N的最短距离。

如果点1和点N不联通则输出-1。


模板。尝试着用邻接表打了一

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;struct bian{int str,next,to;};int n,m,b[1000001],line[100001],sum[100001];bool f[100001];bian a[1000001];int main(){scanf("%d%d",&n,&m);int x,y,z,k=0;for (int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);k++;a[k].next=b[x];a[k].str=z;a[k].to=y;b[x]=k;k++;a[k].next=b[y];a[k].str=z;a[k].to=x;b[y]=k;}int l=1,r=1;line[1]=1;f[1]=true;memset(sum,0x3f,sizeof(sum)),sum[1]=0;while (l<=r){for (int i=b[line[l]];i;i=a[i].next){if (sum[a[i].to]>sum[line[l]]+a[i].str){sum[a[i].to]=sum[line[l]]+a[i].str;if (!f[a[i].to]){line[++r]=a[i].to;//b[r]=a[i].to;f[a[i].to]=true;}}}f[line[l++]]=0;}if (sum[n]<0x3f) printf("%d",sum[n]);else printf("-1");}

下。。结果错误百出。。调了半条。