P2128的题解

可能是我第一篇被通过的题解

好一道图论水题!(虽然因为没有审题交了两遍才过

这题好长啊,一句话题意:


求无向图中的完全图的最大点权和

那就很简单了

对读入的图存为两种形式:邻接矩阵和邻接表

邻接矩阵是为了更快的判断两点之间有没有边

邻接表是为了更快的枚举每一个点所连的每一条边(虽然没有这个必要,但是如果数据更毒瘤的话就有这个必要了

这里我写了链式前向星

不会写链式前向星的戳这里

读入:

#include<cstdio>
struct edge
{
	int v,nxt;
}e[1000*2];
int head[500];
int tot;
int n,m;
int k[500];
bool g[500][500];
void add(int u,int v)
{
	e[++tot].v=v;
	e[tot].nxt=head[u];
	head[u]=tot;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&k[i]);//点权
	for(int i=1,u,v;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		g[u][v]=g[v][u]=1;
		add(u,v);
		add(v,u);
	}
	return 0;
}

为了求点权,我们得用 dfs 搜一下(记得还要判断当前加入的点能否构成完全图

怎么判断是不是完全图呢?

我们把之前加入的点放在一个数组里,然后,每加入一个点,就用邻接矩阵来判断这个点是否与之前加入的点全部都有连边

有的话,那么加入这个点后依然是完全图

没有的话,就不能加上这个点

bool vis[500];
int now[500];//之前加入的点的编号
int t;//目前加入的点数(船只数量)
bool check(int id)//判断是不是完全图
{
	for(int i=1;i<=t;i++)
		if(!g[id][now[i]]) return false;//与其中一点没有连边,则不是完全图
	return true;//与所有点都有连边,是完全图
}
void dfs(int x,int value)
{
	ans=max(ans,value);
	vis[x]=1;
	for(int i=head[x];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(!vis[v]&&check(v))
		{
			now[++t]=v;
			dfs(v,value+k[v]);
			t--;//记得回溯
		}
	}
	vis[x]=0;//记得回溯
}

这里要对每一个点 dfs 一下

for(int i=1;i<=n;i++) now[1]=i,t=1,dfs(i,k[i]);

完整 code

#include<cstdio>
struct edge
{
	int v,nxt;
}e[1000*2];
int head[500];
int tot;
int n,m;
int ans;
int k[500];
bool g[500][500];
bool vis[500];
int now[500];
int t;
int max(int a,int b)
{
	return a>b?a:b;
}
void add(int u,int v)
{
	e[++tot].v=v;
	e[tot].nxt=head[u];
	head[u]=tot;
}
bool check(int id)
{
	for(int i=1;i<=t;i++)
		if(!g[id][now[i]]) return false;
	return true;
}
void dfs(int x,int value)
{
	ans=max(ans,value);
	vis[x]=1;
	for(int i=head[x];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(!vis[v]&&check(v))
		{
			now[++t]=v;
			dfs(v,value+k[v]);
			t--;
		}
	}
	vis[x]=0;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&k[i]);
	for(int i=1,u,v;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		g[u][v]=g[v][u]=1;
		add(u,v);
		add(v,u);
	}
	for(int i=1;i<=n;i++) now[1]=i,t=1,dfs(i,k[i]);
	printf("%d",ans);
	return 0;
}

thx for reading

posted @   osfly  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示