[ABC317C]Remembering the Days 题解

题意#

给定一个图,求其中任意两点之间距离的最大值,不能重复访问(类似于最长路(也许))。

思路#

由于我赛时的时候脑子抽了不知道咋写,差点挂,最后写成了状压DP,设 \(dp[i][S]\) 表示通过了集合 \(S\) 的点,最后在 \(i\) 点的最长路径。

那么转移方程可得:

\[dp_{v,S\operatorname{xor} (2^v)}\gets\ \max\left\{dp_{u,s}+cost\right\} \]

代码#

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
template<typename P>
inline void read(P &x){
   	P res=0,f=1;
   	char ch=getchar();
   	while(ch<'0' || ch>'9'){
   		if(ch=='-') f=-1;
   		ch=getchar();
   	}
   	while(ch>='0' && ch<='9'){
   		res=res*10+ch-'0';
   		ch=getchar();
	}
	x=res*f;
}
int n,m;
const int Max=20;
struct node{
	int to,w;
};
vector<node> e[120];
int dp[120][1<<14];
signed main(){
	read(n),read(m);
	int u,v,w;
	for(int i=1;i<=m;++i){
		read(u),read(v),read(w);
		u--,v--;
		e[u].push_back(node{v,w});
		e[v].push_back(node{u,w});
	}
	int ans=0;
	int mas=1<<n;
	int to;
	for(int s=0;s<mas;++s){
		for(int i=0;i<n;++i){
			if((s>>i)&1){
				for(auto edge:e[u=i])
					if(!(s>>(to=edge.to)&1)){
						dp[to][s^(1<<to)]=max(dp[to][s^(1<<to)],dp[u][s]+edge.w);
					}
			}
		}
	}
	for(int i=0;i<n;++i){
		ans=max(ans,dp[i][mas-1]);
	}
	cout<<ans<<endl;
	return 0;
}


作者:God_Max_Me

出处:https://www.cnblogs.com/lizihan00787/p/18323113

版权:本作品采用「God_Max_Me-非商业性使用」许可协议进行许可。

posted @   God_Max_Me  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示