点击跳转例题
思路:
求路径的时候就是Floyd的模板,但是多了一个记录点的最短路的最大值点权之和(金币的价值最大),那么我们多开一个w(i,j)数组,这样就可以记录了,表示 i -> j 的最大点权之和。
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f; int a[M]; char g[M][M]; int d[M][M],w[M][M]; signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n;cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { char ch;cin>>ch; if(i==j) { w[i][j]=a[i]; d[i][j]=0; } else { if(ch=='Y') { d[i][j]=1; w[i][j]=a[i]+a[j]; } else { d[i][j]=INF; w[i][j]=0; } } } } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(d[i][j]>d[i][k]+d[k][j]) { d[i][j]=d[i][k]+d[k][j]; w[i][j]=w[i][k]+w[k][j]-a[k]; } else if(d[i][j]==d[i][k]+d[k][j]) { w[i][j]=max(w[i][j],w[i][k]+w[k][j]-a[k]); } } int q;cin>>q; while(q--) { int x,y;cin>>x>>y; if(d[x][y]>INF/2) cout<<"Impossible"<<endl; else cout<<d[x][y]<<' '<<w[x][y]<<endl; } return 0; }
[ABC286E] Souvenir--2024冲刺蓝桥杯省一
最新推荐文章于 2024-11-08 23:39:16 发布