Submission #1170388

#TimeUsernameProblemLanguageResultExecution timeMemory
1170388rayan_bdDreaming (IOI13_dreaming)C++20
0 / 100
1096 ms12688 KiB
#include <bits/stdc++.h>
#include "dreaming.h"

using namespace std;

#define ll long long
#define show(n) cout<<n<<'\n'
#define all(v) v.begin(), v.end()
#define pb push_back
#define fi first
#define se second

const int INF = 2e9;
const int mxN = 1e5 + 5;

vector<pair<int,int>> adj[mxN];
int compo[mxN],curr=1,t1=0,t2=0;
bool vis[mxN];

void add_edge(int u,int v,int w){
	adj[u].pb({v,w});
	adj[v].pb({u,w});
}

int dfs(int u,int par,int w){
	if(curr==1) compo[u]=curr;
	int mx=w;
	for(auto it:adj[u]){
		if(it.fi^par) mx=max(mx,dfs(it.fi,u,w+it.se));
	}
	return mx;
}


void calc(int u,int par,int w,int &cr){
	cr=max(cr,w);
	vis[u]=1;
	for(auto it:adj[u]){
		if(it.fi!=par) calc(it.fi,u,w+it.se,cr);
	}
}


int travelTime(int N,int M,int L,int A[],int B[],int T[]){

	for(int i=0;i<M;++i) add_edge(A[i],B[i],T[i]);
	int cost1=INF,cost2=INF;
	dfs(0,-1,0); ++curr;
	for(int i=0;i<N;++i){
		if(compo[i]==1){
			cost1=min(cost1,dfs(i,-1,0));
		}else{
			cost2=min(cost2,dfs(i,-1,0));
		}
	}

	vector<int> t(3,0);

	int done=0;

	for(int i=0;i<N;++i){
		if(!vis[i]&&adj[i].size()==1){
			calc(i,-1,0,t[done]);
			++done;
		}
	}

	curr=1;
	for(int i=0;i<N;++i) adj[i].clear(),compo[i]=0ll;
	return max({cost1+cost2+L,t[0],t[1]});
}
#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...