Floyd(选地址)
Description
小X有很多朋友,分布在N个城市。。
这NN个城市之间,有些有直接的道路,有些是间接联通的(保证任何两个城市都可以相互到达。。)
但是、经过每条道路都是有代价的、
于是。。
小X希望你来帮他找出一个城市,使得他的所有朋友到这个城市的代价最小。
Input
输入共2∗n+1行,
其中第一行为一个整数N
第2~N+1行,每行有N个整数、表示两个城市间的代价、(0表示不直接连通)
第n+2~2∗N+1行,每行一个整数。表示每个城市中小X的朋友数。
Output
输出有两行。
第一行为你选中的城市
第二行为最小需要的代价。
Samples
Hint
对于100%的数据,n≤200, 输出保证不超过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; }