TLE40分求助
查看原帖
TLE40分求助
537998
lpx2024楼主2024/7/4 21:55
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int maxN=100010;
struct node{
	int to,val;
};
vector<node> v[maxN];
int fa[maxN],g[maxN],dp[maxN][2],tmp[maxN],d;
bool cmp(int x,int y){
	return x>y;
}
inline void read(int &a){
	int w=0,f=1;
	char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) w=(w<<3)+(w<<1)+(ch^48);
	a=w*f; 
}
inline void dfs(int x){
	int cnt=0;
	for(register int i=0;i<v[x].size();i++){
		int y=v[x][i].to;
		if(y==fa[x]) continue;
		fa[y]=x;
		dfs(y);
	}
	for(register int i=1;tmp[i];i++) tmp[i]=0;
	for(register int i=0;i<v[x].size();i++){
		int y=v[x][i].to;
		if(y==fa[x]) continue;
		tmp[++cnt]=dp[y][0]+v[x][i].val;
	}
	sort(tmp+1,tmp+cnt+1,cmp);
	for(register int i=1;i<=g[x]-1+(x==d);i++) dp[x][0]+=tmp[i];
	int lw=tmp[g[x]-1+(x==d)];
	if(g[x]>=2 || x==d){
		dp[x][1]=dp[x][0]-lw;
		for(register int i=0;i<v[x].size();i++){
			int y=v[x][i].to;
			if(y==fa[x]) continue;
			int d0=dp[y][0]+v[x][i].val,d1=dp[y][1]+v[x][i].val;
			if(d0>=lw) dp[x][1]=max(dp[x][1],dp[x][0]-d0+d1);
			else dp[x][1]=max(dp[x][1],dp[x][0]-lw+d1);
		}
	}
}
int main(){
	int n,x,y,w;
	read(n);read(d);
	for(register int i=1;i<n;i++){
		read(x);read(y);read(w);
		v[x].push_back(node{y,w});
		v[y].push_back(node{x,w});
	}
	for(register int i=1;i<=n;i++){
		read(g[i]);
		dp[i][1]=-1e9;
	}
	dfs(d);
	cout<<dp[d][1];
	return 0;
}

怀疑是不是卡死循环了,其他数据点都是几十毫秒

显示"Received signal 24: CPU time limit exceeded." 三次访问子节点优化不了了,一次dfs一次统计tmp(在dfs时统计会导致被子节点的tmp覆盖) 还有一次枚举出去的节点的位置

2024/7/4 21:55
加载中...