Floyd(选地址)

Description

小X有很多朋友,分布在N个城市。。
NN个城市之间,有些有直接的道路,有些是间接联通的(保证任何两个城市都可以相互到达。。)
但是、经过每条道路都是有代价的、
于是。。
小X希望你来帮他找出一个城市,使得他的所有朋友到这个城市的代价最小。

Input

输入共2n+1行,
其中第一行为一个整数N
第2~N+1行,每行有N个整数、表示两个城市间的代价、(0表示不直接连通)
n+2~2N+1行,每行一个整数。表示每个城市中小X的朋友数。

Output

输出有两行。
第一行为你选中的城市
第二行为最小需要的代价。

Samples

Input Copy
5
0 1 2 0 0 
1 0 0 0 20
2 0 0 10 0
0 0 10 0 1
0 20 0 1 0
2
3
4
5
6
Output
4
109

Hint

对于100%的数据,n200, 输出保证不超过long int

Source

石光中学 2018泉州集训普及组day5

这个题就是 Floyd处理一下矩阵

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e3+100;
ll a[maxn][maxn];
ll dis[maxn];
ll q[maxn];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
            if(a[i][j]==0){
                a[i][j]=0x3f3f3f3f;
            }
        } 
    } 
    for(int i=1;i<=n;i++){
        a[i][i]=0;
    }
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
            }
        }
    }
    for(int i=1;i<=n;i++){
        cin>>q[i];
    }
    ll ans=0x3f3f3f3f;
    int x;
    for(int i=1;i<=n;i++){
        ll z=0;
        for(int j=1;j<=n;j++){
            z+=q[j]*a[i][j];
        }
        if(z<ans){
            ans=z;
            x=i;
        }
    } 
    cout<<x<<endl<<ans<<endl;
}
原文地址:https://www.cnblogs.com/lipu123/p/14305892.html