最短路径问题

题目描述

NowCoder今年买了一辆新车,他决定自己开车回家过年。回家过程中要经过n个大小收费站,每个收费站的费用不同,你能帮他计算一下最少需要给多少过路费吗?

输入描述:

输入包含多组数据,每组数据第一行包含两个正整数m(1≤m≤500)和n(1≤n≤30),其中n表示有n个收费站,编号依次为1、2、…、n。出发地的编号为0,终点的编号为n,即需要从0到n。

紧接着m行,每行包含三个整数f、t、c,(0≤f, t≤n; 1≤c≤10),分别表示从编号为f的地方开到t,需要交c元的过路费。

输出描述:

对应每组数据,请输出至少需要交多少过路费。

输入

8 4
0 1 10
0 2 5
1 2 2
1 3 1
2 1 3
2 3 9
2 4 2
3 4 4

输出

7

#include "stdio.h"
int main(){
    int a[31][31];
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF){
        for(int i=0;i<31;i++){
            for(int j=0;j<31;j++){
                a[i][j]=0;
            }
        }
        int f,t,c;
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&f,&t,&c);
            a[f][t]=c;
        }
        for(int k=0;k<=n;k++){
            for(int i=0;i<=n;i++){
                for(int j=0;j<=n;j++){
                    if(k!=i&&k!=j&&i!=j){
                        if(a[i][k]>0&&a[k][j]>0&&a[i][j]>0)
                        a[i][j]=(a[i][k]+a[k][j])<a[i][j]?a[i][k]+a[k][j]:a[i][j];
                        else if(a[i][k]>0&&a[k][j]>0&&a[i][j]==0)
                          a[i][j]=a[i][k]+a[k][j];
                    }
                }
            }
        }
        printf("%d
",a[0][n]);
    }
}
原文地址:https://www.cnblogs.com/achao123456/p/10163955.html