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;
}

浙公网安备 33010602011771号