本题地址:(http://acm.hdu.edu.cn/showproblem.php?pid=2544)
本题使用的是Dijkstra算法,这种算法的时间复杂度为O(V*V),使用这种前提—>是图没有负权值边,不然这种算法就无法解决问题,还得使用Bellman-Ford算法(使用这种算法的前提是图中不存在负圈:从源点可达的总权值为负的回路)
AC代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=111;
const int inf=201314;
int n,m,cost[maxn][maxn],vis[maxn],dis[maxn];
void init()
{
memset(cost,0,sizeof(cost));
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(i!=j)
cost[i][j]=inf;
}
void dijkstra()
{
memset(vis,false,sizeof(vis));
for(int i=1; i<=n; i++)
dis[i]=cost[1][i];
vis[1]=true;
for(int i=1; i<=n; i++)
{
int mins=inf,pos=1;
for(int j=1; j<=n; j++)
if(!vis[j]&&dis[j]<mins)
mins=dis[pos=j];
vis[pos]=true;
for(int k=1; k<=n; k++)
if(!vis[k]&&dis[k]>dis[pos]+cost[pos][k])
dis[k]=dis[pos]+cost[pos][k];
}
}
int main()
{
while(cin>>n>>m&&(m+n))
{
init();
for(int i=0; i<m; i++)
{
int from,to,co;
cin>>from>>to>>co;
if(co<cost[from][to])
cost[from][to]=cost[to][from]=co;
}
dijkstra();
cout<<dis[n]<<endl;
}
return 0;
}
原文地址:http://blog.csdn.net/u014004096/article/details/44515151