제출 #239468

#제출 시각아이디문제언어결과실행 시간메모리
239468kshitij_sodaniIzlet (COI19_izlet)C++17
100 / 100
856 ms61816 KiB
#include <bits/stdc++.h>
using namespace std;
typedef int64_t llo;
#define mp make_pair
#define pb push_back
#define a first 
#define b second
int dist[3001][3001];
int par[3001];
int col[3001];
int find(int no){
	if(par[no]==no){
		return no;
	}
	par[no]=find(par[no]);
	return par[no];
}
vector<int> adj[3001];
vector<int> ord;
int vis[3001];

void dfs(int no,int par=-1){
	ord.pb(no);
	for(auto j:adj[no]){
		if(j==par){
			continue;
		}
		dfs(j,no);
	}
}
int cur=0;
int st=0;
int kk;
void dfs2(int no,int par=-1,int par2=-1){
	if(par2==-1){
		for(auto j:adj[no]){

			if(vis[j]){
				dfs2(j,no,j);
			}
		}
	}
	else{
		if(dist[no][kk]==dist[no][par2]){
			col[kk]=col[no];
			st=1;
			return;
		}
		for(auto j:adj[no]){
			if(par==j){
				continue;
			}
			if(vis[j]){
				dfs2(j,no,par2);
			}
		}
	}
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int te;
	cin>>te;
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		par[i]=i;
		for(int j=0;j<n;j++){
			cin>>dist[i][j];
		}
	}

	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			if(dist[i][j]==1){
				int x=find(i);
				int y=find(j);
				par[x]=y;
			}
		}
	}
	map<int,vector<int>> ss;
	for(int i=0;i<n;i++){
		find(i);
		ss[par[i]].pb(i);
	}
	vector<pair<int,int>> ans;
	vector<int> tt;
	for(auto j:ss){
		for(int i=0;i<j.b.size()-1;i++){
			ans.pb({j.b[i],j.b[i+1]});
		}
		tt.pb(j.a);
	}
	for(int i=0;i<tt.size();i++){
		for(int j=i+1;j<tt.size();j++){
			int x=find(tt[i]);
			int y=find(tt[j]);
			if(x==y){
				continue;
			}
			if(dist[tt[i]][tt[j]]==2){
				par[x]=y;
				ans.pb({tt[i],tt[j]});
			}
		}
	}
	for(auto j:ans){
		adj[j.a].pb(j.b);
		adj[j.b].pb(j.a);
	}
	dfs(0);

	for(auto j:ord){
//		cout<<j<<',';
//		cur.clear();
		kk=j;
		st=0;
		dfs2(j);
		if(st==0){
			cur+=1;
			col[j]=cur;
		}
		vis[j]=1;

	}
//	cout<<endl;
/*	for(auto j:ss){
		for(int i=0;i<j.b.size()-1;i++){
			col[j.b[i]]=col[j.b.back()];
		}
		//tt.pb(j.b.back());
	}*/
	for(int i=0;i<n;i++){

		cout<<col[i]<<" ";
		
	}
	cout<<endl;
	for(auto j:ans){
		cout<<j.a+1<<" "<<j.b+1<<endl;
	}







	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

izlet.cpp: In function 'int main()':
izlet.cpp:90:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<j.b.size()-1;i++){
               ~^~~~~~~~~~~~~
izlet.cpp:95:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<tt.size();i++){
              ~^~~~~~~~~~
izlet.cpp:96:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=i+1;j<tt.size();j++){
                 ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...