洛谷 [语言月赛 202508] 中转达人 题解
这道题虽然是个模拟题,但是坑点可不少,首先if有直达线路就让答案统计一下,接着遍历一下,如果b[u][j]和b[j][v]都有线路,那么也统计一下线路
以上是我当时的思路,后来debug的时候发现了问题:
- 在输出的时候,如果答案还是INT_MAX(即是两种线路都行不通)就要输出-1
- 在找线路的时候,注意要判断j是不是v或者u,不然就会自己连到自己,然后靠着更低的转接价钱直奔终点(如果你wa#9 #10)
代码展示:
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define fastio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
signed main()
{
fastio;
int n,q;
cin>>n>>q;
int a[n+5][n+5],b[n+5][n+5];
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>a[i][j];
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>b[i][j];
for(int i=1;i<=q;i++)
{
int ans=LLONG_MAX,u,v;
cin>>u>>v;
if(a[u][v]!=-1)ans=min(ans,a[u][v]);
for(int j=1;j<=n;j++)
{
if(j==u||j==v)continue;
if((b[u][j]!=-1)&&(b[j][v]!=-1))ans=min(ans,(b[u][j]+b[j][v]));
}
if(ans==LLONG_MAX)ans=-1;
cout<<ans<<"\n";
}
return 0;
}

浙公网安备 33010602011771号