1.环境治理
分析:最开始进入了一个误区,觉得都有通路了直接算通路就可以,后来才发现居然是最小路径的总和,所以大概是每减一次都要算一次各点之间的最小路径了,然后是循环,到需要的条件为止
总的来说思路不算难,但是写起来非常的 麻烦,调试的时候写了很多的输出
#include <bits/stdc++.h>
using namespace std;
main() {
long long m,n,i,j,k,c,d,e,f,ans=0,ans0,ans1;
cin>>n>>m;
long long a[n][n],l[n][n],dp[n][n];
//接收收据
for(i=0; i<n; i++) {
for(j=0; j<n; j++)
{
cin>>a[i][j];
dp[i][j]=a[i][j];}
}
for(i=0; i<n; i++) {
for(j=0; j<n; j++)
cin>>l[i][j];
}
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
cout<<l[i][j]<<" ";
}
cout<<endl;
}
//最短路径
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
for(k=0; k<n; k++) {
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
//剪枝
ans=0;ans1=0;
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
ans+=dp[i][j];
ans1+=l[i][j];
}
}
//输出
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
cout<<ans<<" "<<ans1<<endl;
if(ans<=m) {
cout<<0;
return 0;
}
if(ans1>m) {
cout<<-1;
return 0;
}
//查天数+最短路径+剪枝
for(c=0;; c++) {
//更新数据
f=c%n;
for(i=0; i<n;i++) {
if(a[i][f]>l[i][f]) a[i][f]-=1;
if(a[f][i]>l[f][i]) a[f][i]-=1;
}
for(i=0; i<n; i++) {
for(j=0; j<n; j++)
{
dp[i][j]=a[i][j];}
}
ans=0;
//最短路径
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
for(k=0; k<n; k++) {
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
cout<<"//"<<endl;
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
ans=0;
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
ans+=dp[i][j];
}
}
cout<<ans<<endl;
if(ans<=m) {
cout<<c+1;
return 0;
}
}
return 0;
}
/*
3 10
0 2 4
2 0 1
4 1 0
0 2 2
2 0 0
2 0 0
*/