这个为啥有问题啊,求助大佬!
查看原帖
这个为啥有问题啊,求助大佬!
249769
283688RYL楼主2020/5/11 14:05
#include<cstdio>  
#include<iostream>   
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
const long long INF = 1e10+10;
int n,m;
long long cost[1005][1005];
long long d[1005];
bool used[1005];
long long sum = 0;
void Dijkstra(){  // 最短路算法
    for(int i = 1 ; i <= n ; i++){
        used[i] = false;
        d[i] = INF;
    }
    d[1] = 0;
    while(true){
        int v = -1;
        for(int i = 1 ; i <= n ; i++){
            if(!used[i] && (v == -1 || d[i] < d[v])){
                v = i;
            }
        }
        if(v == -1){
            break;
        }
        used[v] = true;
        for(int i = 1 ; i <= n ; i++){
            d[i] = min(d[i] , d[v] + cost[v][i]);
        }
    }
    for(int i = 1 ; i <= n ; i++){  //每一次将对于每个点的最短距离累加;
        sum += d[i];
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i = 1 ; i <= n ; i++){
        for(int j = 1 ; j <= n ; j++){
            if(i == j){
                cost[i][j] = 0;
            }else{
                cost[i][j] = INF;
            }
        }
    }
    for(int i = 1 ; i <= m ; i++){
        int a,b;
        long long c;
        scanf("%d%d%lld",&a,&b,&c);
        cost[a][b] = c;
    }
    Dijkstra();
    for(int i = 1 ; i <= n ; i++){  //矩阵转置
        for(int j = i+1 ; j <= n ; j++){
            swap(cost[i][j], cost[j][i]);
        }
    }
    Dijkstra();
    printf("%lld\n",sum);
    return 0;
}
2020/5/11 14:05
加载中...