ARC159解题报告

比赛传送门

A. Copy and Paste Graph

题意: 给定一个 n×n 的邻接矩阵,将其复制 k2 遍(行和列各 k 个),得到一个 nk 个点的有向图。有 q 次询问,每次询问 st 的最短路长度(或不可达)。n,q100,k109

考察一个点 x 在新图上能到达哪些点,设其为 pn+q(1qn),则容易发现其能到达 pn+q(qq)。所以,本质上此题的图对于不同的 p 是等价的,且可以直接到达不同的 p。于是可以对原来的 n×n 的图跑 Floyd,答案即为 qsqt 的最短路。

image

如图所示,复制的 k2 个版本的对应点都是可以直接到达的,如 2 能到达 3,也同样能到达复制图中的 3

By zhoukangyang

const int N = 107;
ll n, k;
int G[N][N];
int main() {
	ios :: sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> k;
	L(i, 1, n) {
		L(j, 1, n) {
			cin >> G[i][j];
			if(G[i][j] == 0) 
				G[i][j] = 1e9;
		}
	}
	L(k, 1, n) 
		L(i, 1, n) 
			L(j, 1, n) 
				G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
	int q;
	cin >> q;
	while(q--) {
		ll x, y;
		cin >> x >> y;
		x = (x - 1) % n + 1;
		y = (y - 1) % n + 1;
		if(G[x][y] > n) 
			cout << -1 << '\n';
		else 
			cout << G[x][y] << "\n";
	}
	return 0;
}

同样可以每次询问暴力 BFS 求最短路。

By kotatsugame

#include<iostream>
#include<queue>
using namespace std;
int N,K;
int A[100][100];
int dist[100];
int main()
{
	cin>>N>>K;
	for(int i=0;i<N;i++)for(int j=0;j<N;j++)cin>>A[i][j];
	int Q;cin>>Q;
	for(;Q--;)
	{
		long s,t;cin>>s>>t;
		s--,t--;
		s%=N,t%=N;
		for(int i=0;i<N;i++)dist[i]=1e9;
		queue<int>Q;
		Q.push(s);
		while(!Q.empty())
		{
			int u=Q.front();
			Q.pop();
			int c=u==s?0:dist[u];
			for(int v=0;v<N;v++)if(A[u][v]==1&&dist[v]>c+1)
			{
				dist[v]=c+1;
				Q.push(v);
			}
		}
		int ans=dist[t];
		if(ans==(int)1e9)ans=-1;
		cout<<ans<<"\n";
	}
}
posted @   曹轩鸣  阅读(55)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起