107292024-04-10 19:55:31111Útvonalakcpp17Wrong answer 0/100381ms137656 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
#ifdef CB
	freopen("be2.txt","r",stdin);
//	freopen("ki.txt","w",stdout);
#endif
	int N,M,K;
	cin>>N>>M>>K;
	vector<vector<int>>g(N+1);
	for(int i=0;i<M;i++){
		int a,b;
		cin>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	vector<int>v(N+1),w(N+1),p(N+1),a(N+1);
	vector<vector<int>>c(N+1),cc;
	auto dfs=[&](auto self,int i)->unordered_set<int>{
		unordered_set<int>s;
		w[i]=v[i];
		for(int j:g[i]){
			if(j==p[i]){
				continue;
			}
			if(v[j]){
				if(v[j]<v[i]){
					w[i]=min(w[i],v[j]);
				}
				continue;
			}
			v[j]=v[i]+1;
			p[j]=i;
			auto z=self(self,j);
			if(w[j]>=v[i]){
				a[i]=1;
				z.insert(i);
				for(int k:z){
					c[k].push_back(cc.size());
				}
				cc.emplace_back(z.begin(),z.end());
			}
			else{
				w[i]=min(w[i],w[j]);
				if(s.size()<z.size()){
					swap(s,z);
				}
				s.insert(z.begin(),z.end());
			}
		}
		s.insert(i);
		return s;
	};
	v[1]=1;
	dfs(dfs,1);
	vector<vector<int>>q(N+1);
	for(int i=0;i<K;i++){
		int a,b;
		cin>>a>>b;
		q[a].push_back(i);
		q[b].push_back(i);
	}
	vector<int>ans(K,-1);
	auto dfs2=[&](auto self,int i,int p)->unordered_map<int,int>{
		if(!a[i]){
			exit(1);
		}
		unordered_map<int,int>s;
		for(int x:q[i]){
			s[x]=0;
		}
		for(int j:c[i]){
			if(j==p){
				continue;
			}
			unordered_map<int,int>t;
			for(int k:cc[j]){
				if(k==i||!a[k]){
					continue;
				}
				auto z=self(self,k,j);
				if(t.size()<z.size()){
					swap(t,z);
				}
				for(auto[x,y]:z){
					if(t.count(x)){
						ans[x]=t[x]+y;
						t.erase(x);
					}
					else{
						t[x]=y+cc[j].size()-1;
					}
				}
			}
			for(int k:cc[j]){
				if(k==i||a[k]){
					continue;
				}
				for(int x:q[k]){
					if(t.count(x)){
						ans[x]=t[x]+1;
						t.erase(x);
					}
					else{
						t[x]=cc[j].size()-1;
					}
				}
			}
			if(s.size()<t.size()){
				swap(s,t);
			}
			for(auto[x,y]:t){
				if(s.count(x)){
					ans[x]=s[x]+y+1;
					s.erase(x);
				}
				else{
					s[x]=y;
				}
			}
		}
		return s;
	};
	dfs2(dfs2,1,-1);
	for(int i:ans){
		cout<<i-2<<'\n';
	}
	return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Wrong answer3ms1828 KiB
2Wrong answer171ms44432 KiB
subtask20/15
3Wrong answer4ms2840 KiB
4Wrong answer4ms3448 KiB
5Wrong answer7ms6272 KiB
6Accepted14ms7328 KiB
7Wrong answer75ms24040 KiB
8Wrong answer180ms45092 KiB
subtask30/15
9Wrong answer4ms3564 KiB
10Wrong answer4ms4176 KiB
11Wrong answer8ms6868 KiB
12Wrong answer14ms7832 KiB
13Wrong answer86ms28208 KiB
14Wrong answer199ms53972 KiB
15Wrong answer381ms113624 KiB
subtask40/15
16Wrong answer4ms4792 KiB
17Wrong answer8ms5684 KiB
18Wrong answer14ms8548 KiB
19Wrong answer83ms25180 KiB
20Wrong answer194ms46412 KiB
subtask50/15
21Wrong answer3ms4236 KiB
22Wrong answer3ms4516 KiB
23Wrong answer4ms5484 KiB
24Wrong answer3ms4840 KiB
25Wrong answer4ms5268 KiB
26Wrong answer4ms5276 KiB
subtask60/40
27Wrong answer3ms5028 KiB
28Wrong answer189ms47396 KiB
29Wrong answer4ms2840 KiB
30Wrong answer4ms3448 KiB
31Wrong answer7ms6272 KiB
32Accepted14ms7328 KiB
33Wrong answer75ms24040 KiB
34Wrong answer180ms45092 KiB
35Wrong answer4ms3564 KiB
36Wrong answer4ms4176 KiB
37Wrong answer8ms6868 KiB
38Wrong answer14ms7832 KiB
39Wrong answer86ms28208 KiB
40Wrong answer199ms53972 KiB
41Wrong answer381ms113624 KiB
42Wrong answer4ms4792 KiB
43Wrong answer8ms5684 KiB
44Wrong answer14ms8548 KiB
45Wrong answer83ms25180 KiB
46Wrong answer194ms46412 KiB
47Wrong answer3ms4236 KiB
48Wrong answer3ms4516 KiB
49Wrong answer4ms5484 KiB
50Wrong answer3ms4840 KiB
51Wrong answer4ms5268 KiB
52Wrong answer4ms5276 KiB
53Wrong answer316ms116416 KiB
54Wrong answer6ms6164 KiB
55Wrong answer8ms9476 KiB
56Wrong answer20ms9620 KiB
57Wrong answer112ms28884 KiB
58Wrong answer103ms30092 KiB
59Wrong answer319ms137656 KiB
60Wrong answer250ms52276 KiB
61Wrong answer257ms53196 KiB
62Wrong answer266ms53676 KiB