hdu 1874 畅通工程续

Dijkstra算法的模板题,嘻嘻,第一道最短路,模板题呀,本来幻想着1A 的,可惜呀,少了一个条件,一个很重要的条件,既然是最短路,有重边的话,当然是保存较短的一条边,结果我根本没注意到,直接覆盖了

悲剧,……………………

最短路径的四个算法,看了快一天了,终于有一点点的收获,多亏了大牛博客上的详解呀

http://www.wutianqi.com/?p=1890   Dijkstra算法实现

http://www.wutianqi.com/?p=1912   Bellman-Ford算法

http://www.wutianqi.com/?p=2285   SPFA(Shortest Path Faster Algorithm) 上一个算法的优化

//以上三个是层层深入的,单源最短路

http://www.wutianqi.com/?p=1903

//这个是求解任意两点间的最短距离

#include<iostream>
#include<string>
using namespace std;
bool s[200];
int c[200][200],dis[200],n,m,S,T;
void dijkstra()
{
	for(int i=0;i<n;i++)
	{
		dis[i]=c[S][i];
	}
	dis[S]=0;
	for(int i=1;i<n;i++)
	{
		int tmp=INT_MAX,v=S;
		for(int j=0;j<n;j++)
			if(!s[j]&&dis[j]<tmp)
			{
				tmp=dis[j];
				v=j;
			}
		s[v]=1;
		for(int j=0;j<n;j++)
			if(!s[j]&&c[v][j]<INT_MAX)
			{
				int newdis=dis[v]+c[v][j];
				if(newdis<dis[j])
					dis[j]=newdis;
			}
	}
}
int main()
{
	int len;
	while(cin>>n>>m)
	{
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				c[i][j]=INT_MAX;
		int a,b;
		for(int k=0;k<m;k++)
		{
			cin>>a>>b>>len;
			if(len<c[a][b])
			{
			 c[a][b]=len;
			 c[b][a]=len;
			}
		}
		cin>>S>>T;
		memset(s,0,sizeof(s));
		s[S]=1;
		dijkstra();
		if(dis[T]<INT_MAX)
			cout<<dis[T]<<endl;
		else cout<<-1<<endl;
	}
	return 0;
}


原文地址:https://www.cnblogs.com/nanke/p/2136496.html