3 2 1 2 5 6 2 3 4 5 1 3 0 0
#include<cstdio> #include<vector> #include<queue> #define MAX 1010 #define INF 0x0FFFFFFF using namespace std; typedef struct Node { int adjvertex; int len; int cost; }Node; int visited[MAX]; int distances[MAX]; int costs[MAX]; vector<Node> map[MAX]; void SPFA(int start,int n) { int i,j; queue<int> q; q.push(start); for(i=1;i<=n;i++) { distances[i]=costs[i]=INF; visited[i]=0; } distances[start]=costs[start]=0; while(!q.empty()) { int index; index=q.front(); q.pop(); visited[index]=1; for(i=0;i<map[index].size();i++) { int t=map[index][i].adjvertex; int dis=map[index][i].len; int cost=map[index][i].cost; if(distances[t]==INF||distances[t]>distances[index]+dis) { distances[t]=distances[index]+dis; costs[t]=costs[index]+cost; if(!visited[t]) { q.push(t); visited[t]=1;//剪枝作用 } } else if(distances[t]==distances[index]+dis) { if(costs[t]>costs[index]+cost) { costs[t]=costs[index]+cost; if(!visited[t]) { q.push(t); visited[t]=1; } } } } } } int main(int argc,char *argv[]) { int i,n,m; int start,end; while(scanf("%d%d",&n,&m)&&n&&m) { for(i=0;i<MAX;i++) map[i].clear(); for(i=0;i<m;i++) { Node p,q; int index; scanf("%d",&index); scanf("%d%d%d",&(p.adjvertex),&(p.len),&(p.cost)); map[index].push_back(p); q.adjvertex=index; q.len=p.len; q.cost=p.cost; map[p.adjvertex].push_back(q); } scanf("%d%d",&start,&end); SPFA(start,n); printf("%d %d\n",distances[end],costs[end]); } return 0; }Dijkstra算法也可以解决:
#include<cstdio> #include<vector> #define MAX 1010 #define INF 0x0FFFFFFF using namespace std; typedef struct Node { int adjvertex; int len; int cost; }Node; int visited[MAX]; int distances[MAX]; int costs[MAX]; vector<Node> map[MAX]; void Dijkstra(int start,int n) { int i,j,k,t; int dis,cost; int min=INF,t_cost; for(i=1;i<=n;i++) { distances[i]=INF; costs[i]=0; visited[i]=0; } for(i=0;i<map[start].size();i++) { int index; index=map[start][i].adjvertex; distances[index]=map[start][i].len; costs[index]=map[start][i].cost; } distances[start]=0; visited[start]=1; for(i=1;i<n;i++) { min=INF; for(j=1;j<=n;j++) { if(!visited[j]&&distances[j]<min) { k=j; min=distances[j]; t_cost=costs[j]; } } visited[k]=1; for(j=1;j<=n;j++) { for(t=0;t<map[k].size();t++) { if(map[k][t].adjvertex!=j) continue; else break; } if(t!=map[k].size()) { dis=map[k][t].len; cost=map[k][t].cost; } else { dis=INF; cost=INF; } if(!visited[j]&&distances[j]>dis+min) { distances[j]=dis+min; costs[j]=t_cost+cost; } else if(!visited[j]&&distances[j]==dis+min&&costs[j]>cost+t_cost) { distances[j]=dis+min; costs[j]=t_cost+cost; } } } } int main(int argc,char *argv[]) { int i,n,m; int start,end; while(scanf("%d%d",&n,&m)&&n&&m) { for(i=0;i<MAX;i++) map[i].clear(); for(i=0;i<m;i++) { Node p,q; int index; scanf("%d",&index); scanf("%d%d%d",&(p.adjvertex),&(p.len),&(p.cost)); map[index].push_back(p); q.adjvertex=index; q.len=p.len; q.cost=p.cost; map[p.adjvertex].push_back(q); } scanf("%d%d",&start,&end); Dijkstra(start,n); printf("%d %d\n",distances[end],costs[end]); } return 0; }用二维数组解决Dijkstra问题会比较方便,用STL使程序看起来略显繁琐,算了,不想再优化了,就这样吧。。。
原文:http://blog.csdn.net/cstopcoder/article/details/19625455