【题意】
给出一个图,起始点是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到点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");
}
下。。结果错误百出。。调了半条。