101512024-03-28 17:44:52111Turista járatokcpp17Elfogadva 100/100212ms91988 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N,M,K;
	cin>>N>>M>>K;
	vector<vector<int>>g(N+1),t(N+1);
	vector<pair<int,int>>e;
	for(int i=0;i<M;i++){
		int a,b;
		cin>>a>>b;
		if(i<K){
			t[a].push_back(b);
			t[b].push_back(a);
			e.emplace_back(a,b);
			e.emplace_back(b,a);
		}
		else{
			g[a].push_back(b);
			g[b].push_back(a);
		}
	}
	if(0){
start:
		int TREE=0;
		N=2+rand()%20,M=TREE?N-1:rand()%min(N*(N-1)/2,N*2),K=M==0?0:rand()%M;
		struct DSU {
			vector<int> v;

			DSU(int n) : v(n + 1, -1) {
			}

			int find(int a) {
				return v[a] < 0 ? a : v[a] = find(v[a]);
			}

			void unite(int a, int b) {
				a = find(a);
				b = find(b);
				if (a == b) {
					return;
				}
				if (v[a] > v[b]) {
					swap(a, b);
				}
				v[a] += v[b];
				v[b] = a;
			}
		};
		DSU dsu(N+1);
		g.clear();
		g.resize(N+1);
		t.clear();
		t.resize(N+1);
		e.clear();
		set<pair<int,int>>s;
		for(int i=0;i<M;i++){
			int a,b;
			do{
				a=1+rand()%N,b=1+rand()%N;
			}
			while(a==b||s.count({a,b})||(TREE&&dsu.find(a)==dsu.find(b)));
			s.insert({a,b});
			s.insert({b,a});
			dsu.unite(a,b);
			if(i<K){
				t[a].push_back(b);
				t[b].push_back(a);
				e.emplace_back(a,b);
				e.emplace_back(b,a);
			}
			else{
				g[a].push_back(b);
				g[b].push_back(a);
			}
		}
	}
	vector<vector<pair<int,int>>>gg(N+1);
	for(int i=1;i<=N;i++){
		for(int j:g[i]){
			gg[i].emplace_back(j,0);
		}
		for(int j:t[i]){
			gg[i].emplace_back(j,1);
		}
	}
#define g gg
	vector<int>v(N+1),w(N+1),u(N+1),z(N+1),p(N+1);
	auto dfs=[&](auto self,int i)->set<int>{
		set<int>ss;
		w[i]=i;
		for(auto[j,b]:g[i]){
			if(j==p[i]){
				continue;
			}
			if(v[j]){
				if(v[j]<v[w[i]]){
					w[i]=j;
				}
				continue;
			}
			v[j]=v[i]+1;
			p[j]=i;
			auto zz=self(self,j);
			if(w[j]==j||w[j]==i){
				int sb=0;
				for(int k:zz)for(auto[jj,b]:g[k])sb|=b&&(zz.count(jj)||jj==w[j]||jj==j);
				if(sb){
					for(int k:zz)z[k]|=1;
					z[j]|=w[j]==i;
				}
				sb=0;
			}
			else{
				zz.insert(j);
				if(zz.size()>ss.size()){
					swap(ss,zz);
				}
				ss.insert(zz.begin(),zz.end());
			}
			if(v[w[j]]<v[w[i]]){
				w[i]=w[j];
			}
			if(b){
				u[j]=1;
			}
		}
		return ss;
	};
	v[1]=1;
	dfs(dfs,1);
	auto dfs2=[&](auto self,int i,int b)->void{
		z[i]|=b;
		for(auto[j,x]:g[i]){
			if(j==p[i]){
				continue;
			}
			if(v[j]&&p[j]!=i){
				continue;
			}
			v[j]=v[i]+1;
			p[j]=i;
			self(self,j,b|u[j]|z[j]|(z[i]&&w[j]==j));
		}
	};
	dfs2(dfs2,1,0);
#undef g
	if(0){
		int st=clock();
		vector<int>ans;
		for(int i=1;i<=N;i++){
			if(z[i])ans.push_back(i);
		}
		vector<int>ans1;
		{
			vector<int>v(N+1),u(N+1);
			auto bt=[&](auto self,int i,int b)->void{
				if(clock()>st+CLOCKS_PER_SEC/10){
					return;
				}
				if(v[i]){
					return;
				}
				if(b){
					u[i]=1;
				}
				v[i]=1;
				for(int j:g[i]){
					self(self,j,b);
				}
				for(int j:t[i]){
					self(self,j,1);
				}
				v[i]=0;
			};
			bt(bt,1,0);
			if(clock()>st+CLOCKS_PER_SEC/10){
				cout<<"TIMEOUT"<<endl;
				goto start;
			}
			for(int i=1;i<=N;i++){
				if(u[i]){
					ans1.push_back(i);
				}
			}
		}
		if(ans1.size()!=ans.size()){
			cout<<"============= INPUT ============="<<endl;
			cout<<N<<" "<<M<<" "<<K<<endl;
			for(int i=1;i<=N;i++){
				for(int j:t[i]){
					if(j<i)continue;
					cout<<i<<' '<<j<<' '<<endl;
				}
			}
			for(int i=1;i<=N;i++){
				for(int j:g[i]){
					if(j<i)continue;
					cout<<i<<' '<<j<<endl;
				}
			}
			cout<<"============= NODES ============="<<endl;
			for(int i=1;i<=N;i++){
				cout<<setw(3)<<i<<" L "<<v[i]<<" D "<<w[i]<<" P "<<p[i]<<endl;
			}
			cout<<"============= EDGES ============="<<endl;
			for(int i=1;i<=N;i++){
				for(int j:g[i]){
					if(j<i)continue;
					int xx=(p[j]==i||p[i]==j?min(v[i],v[j]):0);
					cout<<i<<' '<<j<<' '<<0<<endl;
				}
				for(int j:t[i]){
					if(j<i)continue;
					int xx=(p[j]==i||p[i]==j?min(v[i],v[j]):0);
					cout<<i<<' '<<j<<' '<<1<<endl;
				}
			}
			cout<<"============= GOT ============="<<endl;
			cout<<ans.size()<<'\n';
			for(int i:ans){
				cout<<i<<' ';
			}
			cout<<'\n';
			cout<<"============= EXP ============="<<endl;
			cout<<ans1.size()<<'\n';
			for(int i:ans1){
				cout<<i<<' ';
			}
			cout<<'\n';
			exit(1);
		}
		static int cc=0;
		cout<<"OK "<<setw(9)<<cc++<<" "<<ans.size()<<endl;
		goto start;
	}
	cout<<count(z.begin()+1,z.end(),1)<<'\n';
	for(int i=1;i<=N;i++){
		if(z[i]){
			cout<<i<<' ';
		}
	}
	cout<<'\n';
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1892 KiB
2Elfogadva14ms7044 KiB
subtask210/10
3Elfogadva3ms2300 KiB
4Elfogadva3ms2524 KiB
5Elfogadva3ms2612 KiB
6Elfogadva3ms2768 KiB
7Elfogadva3ms3048 KiB
subtask310/10
8Elfogadva3ms3228 KiB
9Elfogadva3ms3124 KiB
10Elfogadva3ms3272 KiB
11Elfogadva3ms3920 KiB
12Elfogadva6ms5400 KiB
subtask410/10
13Elfogadva9ms7680 KiB
14Elfogadva3ms3708 KiB
15Elfogadva4ms4316 KiB
16Elfogadva4ms4884 KiB
17Elfogadva212ms90888 KiB
18Elfogadva107ms30700 KiB
19Elfogadva134ms35556 KiB
20Elfogadva100ms30308 KiB
subtask510/10
21Elfogadva13ms8768 KiB
22Elfogadva3ms4488 KiB
23Elfogadva3ms4648 KiB
24Elfogadva3ms4788 KiB
25Elfogadva105ms48456 KiB
26Elfogadva14ms8628 KiB
27Elfogadva14ms8572 KiB
subtask660/60
28Elfogadva4ms5076 KiB
29Elfogadva4ms5236 KiB
30Elfogadva4ms5540 KiB
31Elfogadva6ms6300 KiB
32Elfogadva7ms6788 KiB
33Elfogadva8ms7264 KiB
34Elfogadva14ms9456 KiB
35Elfogadva14ms9792 KiB
36Elfogadva13ms9664 KiB
37Elfogadva192ms91988 KiB
38Elfogadva98ms30260 KiB
39Elfogadva107ms31224 KiB
40Elfogadva105ms31508 KiB
41Elfogadva98ms30380 KiB
42Elfogadva101ms31496 KiB
43Elfogadva104ms30764 KiB
44Elfogadva104ms30660 KiB
45Elfogadva135ms36240 KiB
46Elfogadva104ms31356 KiB
47Elfogadva97ms29868 KiB
48Elfogadva100ms30976 KiB
49Elfogadva104ms31076 KiB
50Elfogadva105ms31400 KiB