제출 #500409

#제출 시각아이디문제언어결과실행 시간메모리
500409MohamedAhmed04Rigged Roads (NOI19_riggedroads)C++14
100 / 100
291 ms44644 KiB
#include <bits/stdc++.h>

using namespace std ;

const int MAX = 3e5 + 10 ;

int arr[MAX] ;
int n , m ;

int u[MAX] , v[MAX] ;

vector< vector< pair<int , int> > >adj(MAX) ;

int par[MAX] ;

void init()
{
	for(int i = 1 ; i <= n ; ++i)
		par[i] = i ;
}

int root(int node)
{
	if(par[node] == node)
		return node ;
	return (par[node] = root(par[node])) ;
}

void Union(int x , int y)
{
	int a = root(x) ;
	int b = root(y) ;
	par[a] = b ;
}

int P[MAX] , dep[MAX] , id[MAX] ;

void dfs(int node , int par)
{
	P[node] = par ;
	for(auto &child : adj[node])
	{
		if(child.first == par)
			continue ;
		dep[child.first] = dep[node] + 1 , id[child.first] = child.second ;
		dfs(child.first , node) ;
	}
}

int ans[MAX] ;

vector<int>edges ;
int now = 1 ;

void solve(int x , int y)
{
	edges.clear() ;
	x = root(x) , y = root(y) ;
	while(x != y)
	{
		if(dep[x] < dep[y])
			swap(x , y) ;
		edges.push_back(id[x]) ;
		Union(x , P[x]) ;
		x = root(x) ;
	}
	sort(edges.begin() , edges.end()) ;
	for(auto &i : edges)
		ans[i] = now , ++now ;
}

int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>n>>m ;
	for(int i = 1 ; i <= m ; ++i)
		cin>>u[i]>>v[i] ;
	for(int i = 0 ; i < n-1 ; ++i)
	{
		cin>>arr[i] ;
		adj[u[arr[i]]].emplace_back(v[arr[i]] , arr[i]) ;
		adj[v[arr[i]]].emplace_back(u[arr[i]] , arr[i]) ;
	}
	dfs(1 , -1) ;
	init() ;
	for(int i = 1 ; i <= m ; ++i)
	{
		if(ans[i])
			continue ;
		solve(u[i] , v[i]) ;
		if(!ans[i])
			ans[i] = now , now++ ;
	}
	for(int i = 1 ; i <= m ; ++i)
		cout<<ans[i]<<" " ;
	cout<<"\n" ;
	return 0 ;
}		
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...