Dijkstra最短路径模板1:http://blog.csdn.net/abcjennifer/article/details/7243297
problem: HDU 1874
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
2 -1
// // Dijkstra // ACM // Find the k biggest number in an array // // Created by Rachel on 12-2-23. // Copyright (c) 2014年 ZJU. All rights reserved. // #include <iostream> #include <algorithm> #include <stdio.h> #include <functional> #include <utility> using namespace std; #define N 505 #define INF 100000000 #define min(a,b) a<b?a:b int map[N][N]; int minres[N]; //min distance from source to point_i bool visited[N]; void init(int n) { int i,j; for (i=0; i<n; i++) { for (j=0; j<n; j++) { map[i][j] = INF; } minres[i] = INF; } memset(visited, false, sizeof(visited)); } void dijkstra(int source, int dest, int n) { int i,j; for(i=0;i<n;i++) minres[i]=map[source][i]; visited[source]=true; // (n-1) times, each time select one point into the start point set for (j=0; j<n-1; j++) { //select a point to add into the start point set int minn = INF, point=-1; for(i=0;i<n;i++) if (!visited[i]&&minres[i]<minn) { minn = minres[i]; point = i; } if(point==-1 || point==dest) break; visited[point] = true; //update the min distance of other points for (i=0; i<n; i++) { if (!visited[i]&&minres[i]>minres[point]+map[point][i]) { minres[i] = minres[point]+map[point][i]; } } } } int main() { int i,m,n,a,b,t,source,dest; while (cin>>n>>m) { init(n); for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&t); map[b][a] = map[a][b]= min(map[a][b],t); } cin>>source>>dest; if (source==dest) { cout<<0<<endl; continue; } dijkstra(source,dest,n); if (minres[dest]==INF) { minres[dest] = -1; } cout<<minres[dest]<<endl; } }
#include "iostream" #include "stdio.h" #include "math.h" #include "map" #include "vector" #include "queue" #include "memory.h" #include "algorithm" #include "string" using namespace std; #define N 205 #define INF 1<<29 struct MAP { int node; int dis; MAP(int a,int b) { node=a; dis=b; } }; vector<MAP> path[N]; int minres[N]; int n,m; void spfa(int s,int e) { queue<int>Q; bool used[N]={false}; Q.push(s); used[s]=true; int i; for(i=0;i<n;i++) minres[i]=INF; minres[s]=0; while(!Q.empty()) { int now=Q.front(); Q.pop(); used[now]=false; for(i=0;i<path[now].size();i++) { int tmpend=path[now][i].node; int dis=path[now][i].dis; if(minres[tmpend]>minres[now]+dis) { minres[tmpend]=minres[now]+dis; if(!used[tmpend]) Q.push(tmpend); used[tmpend]=true; } } } } int main() { while(cin>>n>>m) { int i,j,a,b,c; for(i=0;i<n;i++) path[i].clear(); while(m--) { cin>>a>>b>>c; path[a].push_back(MAP(b,c)); path[b].push_back(MAP(a,c)); } cin>>a>>b; spfa(a,b); int ans=minres[b]>=INF?-1:minres[b]; cout<<ans<<endl; } }