107282024-04-10 19:52:36111Útvonalakcpp17Hibás válasz 0/100384ms137120 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+cc[j].size();
						t.erase(x);
					}
					else{
						t[x]=y;
					}
				}
			}
			for(int k:cc[j]){
				if(k==i||a[k]){
					continue;
				}
				for(int x:q[k]){
					if(t.count(x)){
						ans[x]=t[x]+cc[j].size();
						t.erase(x);
					}
					else{
						t[x]=0;
					}
				}
			}
			if(s.size()<t.size()){
				swap(s,t);
			}
			for(auto[x,y]:t){
				if(s.count(x)){
					ans[x]=s[x]+y+cc[j].size();
					s.erase(x);
				}
				else{
					s[x]=y+cc[j].size()-1;
				}
			}
		}
		return s;
	};
	dfs2(dfs2,1,-1);
	for(int i:ans){
		cout<<i-2<<'\n';
	}
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Hibás válasz3ms1828 KiB
2Hibás válasz168ms44444 KiB
subtask20/15
3Elfogadva4ms2828 KiB
4Hibás válasz4ms3524 KiB
5Hibás válasz7ms6428 KiB
6Elfogadva14ms6976 KiB
7Elfogadva75ms23652 KiB
8Hibás válasz178ms44672 KiB
subtask30/15
9Hibás válasz4ms3392 KiB
10Hibás válasz4ms3984 KiB
11Hibás válasz8ms6604 KiB
12Hibás válasz14ms7692 KiB
13Hibás válasz78ms28100 KiB
14Hibás válasz199ms53600 KiB
15Hibás válasz317ms113340 KiB
subtask40/15
16Hibás válasz6ms4556 KiB
17Hibás válasz8ms5424 KiB
18Hibás válasz16ms8228 KiB
19Hibás válasz82ms24988 KiB
20Hibás válasz172ms46424 KiB
subtask50/15
21Elfogadva3ms4496 KiB
22Hibás válasz3ms4628 KiB
23Hibás válasz4ms5616 KiB
24Hibás válasz3ms4776 KiB
25Hibás válasz4ms5016 KiB
26Hibás válasz4ms5124 KiB
subtask60/40
27Hibás válasz3ms4684 KiB
28Hibás válasz189ms46840 KiB
29Elfogadva4ms2828 KiB
30Hibás válasz4ms3524 KiB
31Hibás válasz7ms6428 KiB
32Elfogadva14ms6976 KiB
33Elfogadva75ms23652 KiB
34Hibás válasz178ms44672 KiB
35Hibás válasz4ms3392 KiB
36Hibás válasz4ms3984 KiB
37Hibás válasz8ms6604 KiB
38Hibás válasz14ms7692 KiB
39Hibás válasz78ms28100 KiB
40Hibás válasz199ms53600 KiB
41Hibás válasz317ms113340 KiB
42Hibás válasz6ms4556 KiB
43Hibás válasz8ms5424 KiB
44Hibás válasz16ms8228 KiB
45Hibás válasz82ms24988 KiB
46Hibás válasz172ms46424 KiB
47Elfogadva3ms4496 KiB
48Hibás válasz3ms4628 KiB
49Hibás válasz4ms5616 KiB
50Hibás válasz3ms4776 KiB
51Hibás válasz4ms5016 KiB
52Hibás válasz4ms5124 KiB
53Hibás válasz314ms115764 KiB
54Hibás válasz6ms5440 KiB
55Hibás válasz8ms8720 KiB
56Elfogadva19ms9000 KiB
57Hibás válasz116ms28268 KiB
58Hibás válasz97ms29436 KiB
59Hibás válasz384ms137120 KiB
60Hibás válasz252ms51776 KiB
61Hibás válasz241ms52640 KiB
62Hibás válasz275ms53044 KiB