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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构