社区讨论

为什么数组链表存图会WA

P1352没有上司的舞会参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi7z48zj
此快照首次捕获于
2025/11/21 05:59
4 个月前
此快照最后确认于
2025/11/21 05:59
4 个月前
查看原帖
我原本用的数组,WA了5个点,然后换成vector居然AC了。。。
这也太玄学了吧orz
数组存图代码:
CPP
#include<cstdio>
#include<iostream>


int n,r[6010],first[6010]={0},ans,root,rudu[6010];

struct edge{
	int v,next;
}e[6010];

int cnt=0;
inline void addedge(int u,int v){
	e[++cnt].v=v;e[cnt].next=first[u];first[u]=cnt;
}

int max(int x,int y){
	return x>y?x:y;
}

int f[6010][2];
void dp(int x){
	f[x][0]=0;
	f[x][1]=r[x];
	for(int i=first[x];i;i=e[i].next){
		int v=e[x].v;
		dp(v);
		f[x][0]+=max(f[v][0],f[v][1]);
		f[x][1]+=f[v][0];
	}
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&r[i]);
	}
	int l,k;
	for(int i=1;i<n;i++){
		scanf("%d%d",&l,&k);
		addedge(k,l);
		rudu[l]=1;
	}
	for(int i=1;i<=n;i++){
		if(!rudu[i]){
			root=i;break;
		}
	}
	dp(root);
	printf("%d",max(f[root][0],f[root][1]));
	return 0;
}
vector代码:
CPP
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;

int n,r[6010],first[6010]={0},ans,root,rudu[6010];

struct edge{
	int v,next;
}e[6010];

int cnt=0;
inline void addedge(int u,int v){
	e[++cnt].v=v;e[cnt].next=first[u];first[u]=cnt;
}

vector<int> v[6010];

int max(int x,int y){
	return x>y?x:y;
}

int f[6010][2];
void dp(int x){
	f[x][0]=0;
	f[x][1]=r[x];
	for(int i=0;i<v[x].size();i++){
		int _v=v[x][i];
		dp(_v);
		f[x][0]+=max(f[_v][0],f[_v][1]);
		f[x][1]+=f[_v][0];
	}
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&r[i]);
	}
	int l,k;
	for(int i=1;i<n;i++){
		scanf("%d%d",&l,&k);
		v[k].push_back(l);
		rudu[l]=1;
	}
	for(int i=1;i<=n;i++){
		if(!rudu[i]){
			root=i;break;
		}
	}
	dp(root);
	printf("%d",max(f[root][0],f[root][1]));
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...