洛谷 [语言月赛 202508] 中转达人 题解

这道题虽然是个模拟题,但是坑点可不少,首先if有直达线路就让答案统计一下,接着遍历一下,如果b[u][j]和b[j][v]都有线路,那么也统计一下线路

以上是我当时的思路,后来debug的时候发现了问题:

  1. 在输出的时候,如果答案还是INT_MAX(即是两种线路都行不通)就要输出-1
  2. 在找线路的时候,注意要判断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;
}
posted @ 2025-08-25 14:54  CCCsuper  阅读(27)  评论(0)    收藏  举报
萌ICP备20256293号