Submission #19171

#TimeUsernameProblemLanguageResultExecution timeMemory
19171cometBeads and wires (APIO14_beads)C++14
28 / 100
1086 ms14584 KiB
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cassert>
#include <unordered_map>
#define pb push_back
using namespace std;
typedef pair<int,int> pp;
struct pt{int u,c;};
typedef vector<int> vec;
typedef vector<pt> vec2;
typedef vector<vec> mat;
typedef vector<vec2> graph;

unordered_map<int,int> ID[200010];

mat dp[2];
graph path;

int N;
int root;

void input(){
	scanf("%d",&N);
	path.assign(N+1,vec2());
	dp[0].assign(N+1,vec());
	dp[1].assign(N+1,vec());

	int x,y,z;
	for(int i=0;i<N-1;i++){
		scanf("%d%d%d",&x,&y,&z);
		ID[x][y]=path[x].size();
		ID[y][x]=path[y].size();
		path[x].pb(pt{y,z});
		path[y].pb(pt{x,z});
		dp[0][x].pb(-1);dp[1][x].pb(-1);
		dp[0][y].pb(-1);dp[1][y].pb(-1);
	}
	for(int i=1;i<=N;i++){
		ID[i][i]=path[i].size();
		dp[0][i].pb(-1);
		dp[1][i].pb(-1);
	}
}

void process(int v,int p,int mode){
	int sz=path[v].size();
	int cnt=sz-(v!=root);
	int& ret=dp[mode][v][ID[v][p]];
	ret=0;
	if(cnt==0){
		if(mode==1)ret = -1e9;
		return;
	}

	vec a;
	for(int i=0;i<sz;i++){
		int u=path[v][i].u;
		int c=path[v][i].c;
		int id=ID[u][v];
		if(p==u)continue;
		int z = max(dp[0][u][id],dp[1][u][id]+c);
		ret+=z;
		if(mode==1){
			a.pb(dp[0][u][id]+c-z);
		}
	}
	
	if(mode==1){ // mode==1
		ret+=*max_element(a.begin(),a.end());
	}
}

void dfs(int v,int p,int mode){

	int& ret=dp[mode][v][ID[v][p]];
	if(~ret)return;
	
	for(int i=0;i<path[v].size();i++){
		int u=path[v][i].u;
		if(u==p)continue;
		dfs(u,v,0);
		dfs(u,v,1);
	}
	process(v,p,mode);
}

void PS(){

	int ans=0;
	for(int i=1;i<=N;i++){
		root=i;
		dfs(i,i,0);
		ans=max(ans,dp[0][i][ID[i][i]]);
	}
	printf("%d\n",ans);

}

int main(){
	input();
	PS();
	return 0;
}

Compilation message (stderr)

beads.cpp: In function 'void dfs(int, int, int)':
beads.cpp:80:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<path[v].size();i++){
              ~^~~~~~~~~~~~~~~
beads.cpp: In function 'void input()':
beads.cpp:25:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&N);
  ~~~~~^~~~~~~~~
beads.cpp:32:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d",&x,&y,&z);
   ~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...