一本通 第三部分 数据结构 第四章 图论算法 第二节 最短路径算法 1382:最短路(Spfa)

1382:最短路(Spfa)

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 2196 通过数: 592
【题目描述】
给定 MM 条边, NN 个点的带权无向图。求 11到 NN 的最短路。

【输入】
第一行:N,M(N≤100000,M≤500000)N,M(N≤100000,M≤500000);

接下来MM行33个正整数:ai,bi,ci表示ai,bi之间有一条长度为ci的路,ci≤1000ai,bi,ci表示ai,bi之间有一条长度为ci的路,ci≤1000。

【输出】
一个整数,表示 11 到 NN 的最短距离。

【输入样例】
4 4
1 2 1
2 3 1
3 4 1
2 4 1
【输出样例】
2
【提示】
【样例解释】

注意图中可能有重边和自环,数据保证 11 到 NN 有路径相连。

#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
const int NN=100001;
using namespace std;
struct node
{
    
    
	int from,go,money;
};
vector<int>g[NN];
vector<node>N;
bool inq[NN];
int d[NN];
queue<int>a;
int n,m;
void e(int from,int go,int money)
{
    
    
	N.push_back((node){
    
    from,go,money});
	g[from].push_back(N.size()-1);
}
int main()
{
    
    
	scanf("%d %d",&n,&m);
	fill_n(d,100002,999999);
	for(int i=1;i<=m;i++)
	{
    
    
		int x,y,z;
		scanf("%d %d %d",&x,&y,&z);
		e(x,y,z);
		e(y,x,z);
	}
	d[1]=0;
	a.push(1);
	inq[1]=true;
	while(!a.empty())
	{
    
    
		int u=a.front();
		a.pop();
		inq[u]=false;
		for(int i=0;i<g[u].size();i++)
		{
    
    
			node e=N[g[u][i]];
			if(e.money+d[u]<d[e.go])
			{
    
    
				d[e.go]=e.money+d[u];
				if(!inq[e.go])
				{
    
    
					a.push(e.go);
					inq[e.go]=true;
				}
			}
		}
	}
	printf("%d",d[n]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44043668/article/details/86072465
今日推荐