caioj 1088 最短路模板

【题意】
给出一个图,起始点是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");
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值