HDU 1871 畅通工程续(dijkstra模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874

这个题相比于最简单的单源最短路多了 起点 和 终点 的设置,所以我认为作为模板更好

适合了解过dijkstra算法的人

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 0xfffffff
#define MAX 210
using namespace std;
int map[MAX][MAX],vis[MAX],dis[MAX];
int n,sum;
void init()
{
	for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
	{
		if(i==j) map[i][j]=0;
		else map[i][j]=inf;
	}
}
void dijkstra(int st)//st是起点
{
	memset(vis,0,sizeof(vis));
	int minn,k,i,j;
	for(i=0;i<n;i++)
	{
		dis[i]=map[st][i];
	}
	vis[st]=1;
	for(i=0;i<n;i++)
	{
		minn=inf;
		k=1;
		for(j=0;j<n;j++)
		{
			if(!vis[j]&&dis[j]<minn)
			{
				minn=dis[j];
				k=j;
			}
		}
		vis[k]=1;
		for(j=0;j<n;j++)
		{
			if(!vis[j]&&dis[j]>dis[k]+map[k][j])
			{
				dis[j]=dis[k]+map[k][j];
			}
		}
	}
}
int main()
{
	int m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int i,j,a,b,c;
		int st,en;
		init();
		for(i=1;i<=m;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			if(c<map[a][b])
			{
				map[a][b]=map[b][a]=c;
			}
		}
		scanf("%d%d",&st,&en);
		dijkstra(st);
		if(dis[en]<inf) cout<<dis[en]<<endl;
		else cout<<"-1"<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zvenWang/article/details/82219079