首页 > 代码库 > HDU 1385 Minimum Transport Cost
HDU 1385 Minimum Transport Cost
最短路问题。
题意是说 给你一个矩阵,是各点到各点所需费用。然后给你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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。