hdu 1385 Minimum Transport Cost

8 篇文章 0 订阅
#include<stdio.h>
#include<iostream>
#include<string.h>
#include <algorithm>
#define INF 100000005
using namespace std;

int g[105][105], wi[105];//wi点权
int path[105][105];//路径,记录当前i到j的最短路的第一个节点
int n;
 
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][j] > g[i][k] + g[k][j] + wi[k]){
					g[i][j] = g[i][k] + g[k][j] + wi[k];
					path[i][j] = path[i][k]; //记录路径path[i][k]的后继 
				}
				else if(g[i][j] == g[i][k] + g[k][j] + wi[k] && path[i][j] > path[i][k]){//j>k;
					path[i][j] = path[i][k]; //每次要选择字典序小的路径 
				}
			}
		}
	}
}
 
int main(){
    //freopen("11.txt", "r", stdin);
    while(scanf("%d",&n) ){
        if(n==0)break;
        memset(path,-1,sizeof(path));
		for(int i = 1; i <= n; i ++){
			for(int j = 1; j <= n; j ++){//对g[][]以及path[][]进行初始化 
				scanf("%d",&g[i][j]);
				if(g[i][j] == -1)
					g[i][j] = INF;
				else
					path[i][j] = j;			
			}
		}
		for(int i = 1; i <= n; i ++)
			scanf("%d",&wi[i]);
		floyd(); //调用floyd算法 
		int u,v;
		while(~scanf("%d%d",&u,&v)){
			if(u == -1 && v == -1)
				break;
			printf("From %d to %d :\n",u,v);
			printf("Path: ");
			printf("%d",u);
			if(u == v){ //起点和终点是同一个点时,直接输出即可 
				printf("\n");
			}
			else{
				int next = path[u][v]; //u,v之间的第一个中间结点 ,path[][]路径,i->k->j一定是 k->j也是最短路 
				while(next != v){
					printf("-->%d",next);
					next = path[next][v];
				}
				printf("-->%d\n",v);
			}
			printf("Total cost : %d\n\n",g[u][v]);
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值