题目链接:https://vjudge.net/problem/HDU-2544#author=0
Dijkstra算法:(类似prim算法)
#include <iostream> #include <cstring> using namespace std; const int maxn=1010; const int INF=0x3f3f3f3f; int lowc[maxn],cost[maxn][maxn]; bool vis[maxn]; int n,m; void Dijkstra() { for(int i=2;i<=n;i++) { lowc[i]=cost[1][i];//inf } lowc[1]=0;//自身到自身为0 for(int i=1;i<=n;i++) { int k=-1; for(int j=1;j<=n;j++) { if(!vis[j]&&(k==-1||lowc[j]<lowc[k]))//第一个数或者 { k=j;//距离最近的顶点 } } if(k==-1) break;//所有顶点已经遍历完毕 vis[k]=1; for(int j=1;j<=n;j++) { if(!vis[j]) lowc[j]=min(lowc[j],lowc[k]+cost[k][j]); } } cout<<lowc[n]<<endl; } void init() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) cost[i][j]=0; else cost[i][j]=INF; } } } int main() { ios::sync_with_stdio(false);cin.tie(0); while(cin>>n>>m&&(n||m)) { memset(vis,0,sizeof(vis)); int u,v,w; init(); for(int i=0;i<m;i++) { cin>>u>>v>>w; cost[u][v]=w; cost[v][u]=w; } Dijkstra(); } return 0; }
floyd算法(类似于dp):
void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]); cout<<cost[1][n]<<endl; }
SPFA算法:
void SPFA() { queue<int>q; for(int i=1;i<=n;i++) { lowc[i]=INF; } lowc[1]=0; vis[1]=1; q.push(1); while(!q.empty()) { int now=q.front(); q.pop(); vis[now]=0; for(int i=1;i<=n;i++) { if(lowc[now]+cost[now][i]<lowc[i]) { lowc[i]=lowc[now]+cost[now][i]; if(!vis[i]) { vis[i]=1; q.push(i); } } } } cout<<lowc[n]<<endl; }