最短路问题。
题意是说 给你一个矩阵,是各点到各点所需费用。然后给你N个数,是每个点所需过路费。
然后输出 询问 a,b 之间所需最小费用,还有路径。
如果不是路径 必须输出 最小字典序,这题很简单,必须输出最小字典序就很恶心了。SPFA写
会很麻烦。然后我就Floyd的。把路径也一起更新就好了。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<cmath> #define INF 0x7fffffff #define eps 1e-6 #define LL long long using namespace std; int n,m; int g[101][101]; int cost[101]; int path[101][101]; void Floyd() { for(int k=1; k<=n; k++) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(g[i][k]==INF||g[k][j]==INF)continue; int len=g[i][k]+g[k][j]+cost[k]; if(g[i][j]>len) { g[i][j]=len; path[i][j]=path[i][k]; } else if(g[i][j]==len) { path[i][j]=min(path[i][j],path[i][k]); } } } } } int main() { while(scanf("%d",&n),n) { int tmp; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { scanf("%d",&tmp); if(tmp==-1) g[i][j]=INF; else g[i][j]=tmp; path[i][j]=j; } for(int i=1; i<=n; i++) scanf("%d",&cost[i]); Floyd(); int i,j; while(scanf("%d%d",&i,&j),i!=-1||j!=-1) { printf("From %d to %d :\n", i, j); printf("Path: %d", i); int k = i; while(k != j) { printf("-->%d", path[k][j]); k = path[k][j]; } printf("\n"); printf("Total cost : %d\n\n", g[i][j]); } } }
HDU 1385 Minimum Transport Cost
原文地址:http://blog.csdn.net/dongshimou/article/details/37963423