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
*/