107302024-04-10 20:13:29111Útvonalakcpp17Hibás válasz 30/100395ms142716 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,int d)->unordered_map<int,int>{
		unordered_map<int,int>s;
		for(int x:q[i]){
			s[x]=d;
		}
		for(int j:c[i]){
			if(j==p){
				continue;
			}
			int dd=d+cc[j].size()-1;
			unordered_map<int,int>t;
			for(int k:cc[j]){
				if(k==i||!a[k]){
					continue;
				}
				auto z=self(self,k,j,dd);
				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()-dd*2;
						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]+1;
						t.erase(x);
					}
					else{
						t[x]=dd;
					}
				}
			}
			if(s.size()<t.size()){
				swap(s,t);
			}
			for(auto[x,y]:t){
				if(s.count(x)){
					ans[x]=s[x]+y+1-d*2;
					s.erase(x);
				}
				else{
					s[x]=y;
				}
			}
		}
		return s;
	};
	dfs2(dfs2,1,-1,0);
	for(int i:ans){
		cout<<i-2<<'\n';
	}
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1832 KiB
2Elfogadva173ms44460 KiB
subtask215/15
3Elfogadva4ms2844 KiB
4Elfogadva4ms3456 KiB
5Elfogadva8ms6512 KiB
6Elfogadva14ms7320 KiB
7Elfogadva79ms24104 KiB
8Elfogadva180ms45340 KiB
subtask315/15
9Elfogadva4ms3948 KiB
10Elfogadva4ms4400 KiB
11Elfogadva8ms7036 KiB
12Elfogadva14ms8232 KiB
13Elfogadva85ms28296 KiB
14Elfogadva201ms53840 KiB
15Elfogadva391ms116528 KiB
subtask40/15
16Elfogadva6ms4708 KiB
17Hibás válasz8ms5888 KiB
18Elfogadva14ms8632 KiB
19Elfogadva79ms25700 KiB
20Elfogadva192ms47064 KiB
subtask50/15
21Elfogadva3ms4884 KiB
22Hibás válasz3ms5004 KiB
23Elfogadva4ms6064 KiB
24Hibás válasz3ms5220 KiB
25Elfogadva4ms5464 KiB
26Elfogadva4ms5464 KiB
subtask60/40
27Elfogadva3ms5204 KiB
28Elfogadva174ms47592 KiB
29Elfogadva4ms2844 KiB
30Elfogadva4ms3456 KiB
31Elfogadva8ms6512 KiB
32Elfogadva14ms7320 KiB
33Elfogadva79ms24104 KiB
34Elfogadva180ms45340 KiB
35Elfogadva4ms3948 KiB
36Elfogadva4ms4400 KiB
37Elfogadva8ms7036 KiB
38Elfogadva14ms8232 KiB
39Elfogadva85ms28296 KiB
40Elfogadva201ms53840 KiB
41Elfogadva391ms116528 KiB
42Elfogadva6ms4708 KiB
43Hibás válasz8ms5888 KiB
44Elfogadva14ms8632 KiB
45Elfogadva79ms25700 KiB
46Elfogadva192ms47064 KiB
47Elfogadva3ms4884 KiB
48Hibás válasz3ms5004 KiB
49Elfogadva4ms6064 KiB
50Hibás válasz3ms5220 KiB
51Elfogadva4ms5464 KiB
52Elfogadva4ms5464 KiB
53Elfogadva268ms120156 KiB
54Elfogadva6ms6148 KiB
55Elfogadva8ms9680 KiB
56Hibás válasz19ms9656 KiB
57Hibás válasz119ms28784 KiB
58Hibás válasz97ms29960 KiB
59Elfogadva395ms142716 KiB
60Elfogadva254ms52396 KiB
61Hibás válasz244ms53100 KiB
62Hibás válasz250ms53692 KiB