제출 #697348

#제출 시각아이디문제언어결과실행 시간메모리
697348vjudge1Training (IOI07_training)C++17
100 / 100
11 ms4820 KiB
#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T &x)
{
	x=0;T f=1;char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c=='-')f=-1;
	for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	x*=f;
}
template <typename T,typename ...Args>void read(T &x,Args&...args){read(x),read(args...);}
template <typename T> void print(T x)
{
	if(x<0) x=-x,putchar('-');
	if(x>9) print(x/10);
	putchar(x%10+48);
}
template <typename T> void print(T x,char c){print(x); putchar(c);}
template<typename T>inline void output(T x){print(x,' ');}
template<typename T,typename ...Arg>inline void output(T x,Arg ...arg){output(x);output(arg...);}
const int N=5007;
int n,m,cnt,h[N],dep[N],pa[N][14],id[N],reid[N],sum,f[N][N];
struct edge{int to,nxt;}mp[N<<1];
struct node{int u,v,w;};
vector<node>edg; vector<int>vct[N];
void add(int x,int y)
{
	cnt++;
	mp[cnt].nxt=h[x];
	mp[cnt].to=y;
	h[x]=cnt;
}
void prework(int x,int fa)
{
	pa[x][0]=fa; dep[x]=dep[fa]+1;
	for(int i=1;i<14;i++)
		pa[x][i]=pa[pa[x][i-1]][i-1];
	for(int i=h[x];i;i=mp[i].nxt)
		if(mp[i].to!=fa)
			prework(mp[i].to,x);
}
int LCA(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	int stp=dep[x]-dep[y];
	for(int i=13;i>=0;i--)
		if(stp>=(1<<i))
			stp-=(1<<i),x=pa[x][i];
	if(x==y) return x;
	for(int i=13;i>=0;i--)
		if(pa[x][i]!=pa[y][i])
			x=pa[x][i],y=pa[y][i];
	return pa[x][0];
}
void solve(int x)
{
	int son=0;
	for(int i=h[x];i;i=mp[i].nxt)
	{
		int y=mp[i].to;
		if(y==pa[x][0]) continue;
		solve(y);
	}
	for(int i=h[x];i;i=mp[i].nxt)
	{
		int y=mp[i].to;
		if(y==pa[x][0]) continue;
		id[son]=y; reid[y]=1<<son; son++;
	}
	for(int S=0,now=0;S<(1<<son);S++,now=0)
	{
		for(int i=0;i<son;i++)
			if(!((S>>i)&1))
				now+=f[id[i]][0];
		f[x][S]=now;
	}
	for(int k=vct[x].size()-1;k>=0;k--)
	{
		int i=vct[x][k],now=edg[i].w,a=0,b=0;
		if(edg[i].u!=x) now+=f[edg[i].u][0];
		if(edg[i].v!=x) now+=f[edg[i].v][0];
		if(edg[i].u!=x)
			for(a=edg[i].u;pa[a][0]!=x;a=pa[a][0])
				now+=f[pa[a][0]][reid[a]];
		if(edg[i].v!=x)
			for(b=edg[i].v;pa[b][0]!=x;b=pa[b][0])
				now+=f[pa[b][0]][reid[b]];
		for(int S=0;S<(1<<son);S++)
			if((S&reid[a])==0&&(S&reid[b])==0)
				f[x][S]=max(f[x][S],f[x][S|reid[a]|reid[b]]+now);
	}
}
int main()
{
	read(n,m);
	for(int i=1,x,y,z;i<=m;i++)
	{
		read(x,y,z); sum+=z;
		if(z==0) add(x,y),add(y,x);
		else edg.push_back((node){x,y,z});
	}
	prework(1,0);
	for(int i=0;i<edg.size();i++)
	{
		auto [x,y,z]=edg[i];
		int lca=LCA(x,y);
		if(!((dep[x]+dep[y]-2*dep[lca])&1))
			vct[lca].push_back(i);
	}
	solve(1); print(sum-f[1][0],'\n');
	return 0;
}

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

training.cpp: In function 'int main()':
training.cpp:102:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<node>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |  for(int i=0;i<edg.size();i++)
      |              ~^~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...