洛谷 3959 宝藏 NOIP2017提高组Day2 T2
2024-08-31 00:03:54
【题解】
状压DP. f[i]表示现在的点是否连接的状态是i.
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define rg register
#define N 5000
#define inf (0X7f7f7f7f)
using namespace std;
int n,m,ans=2e9,f[N],dis[],w[N][N];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
void dfs(int x){
for(rg int i=;i<=n;i++)if(<<(i-)&x)
for(rg int j=;j<=n;j++)if(w[i][j]!=inf&&(<<(j-)&x)==)
if(f[x|(<<(j-))]>f[x]+dis[i]*w[i][j]){
int d=dis[j];
dis[j]=dis[i]+;
f[x|(<<(j-))]=f[x]+dis[i]*w[i][j];
dfs(x|(<<(j-)));
dis[j]=d;
}
}
int main(){
n=read(); m=read();
memset(w,inf,sizeof(w));
for(rg int i=;i<=m;i++){
int u=read(),v=read(),d=read();
w[u][v]=w[v][u]=min(w[u][v],d);
}
for(rg int i=;i<=n;i++){
memset(f,inf,sizeof(f));
memset(dis,inf,sizeof(dis));
dis[i]=; f[<<(i-)]=;
dfs(<<(i-));
ans=min(ans,f[(<<n)-]);
}
printf("%d\n",ans);
return ;
}
最新文章
- HBase中批量修改
- [网络流24题] 太空飞行计划(cogs 727)
- angularjs学习资料
- OBject copy 和retain区别
- [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇&#183;基于C#上位机软件开发
- 二分搜索法(转载自vanezkw)
- IBatis.net 输出SQL语句(七)
- Java之Map
- MongoDB[mark]总忘记它们是干啥的
- C++中的栈和队列
- Java 多线程 笔记 转自http://www.cnblogs.com/lwbqqyumidi/p/3804883.html
- 【2019雅礼集训】【最大费用流】【模型转换】D2T3 sum
- R语言如何将字符串转变为命令执行
- 互评Alpha版本—SkyHunter
- IDC 知识库
- C#枚举(enum)、常量(const)和readonly
- git提交代码
- 低于0.01%的极致Crash率是怎么做到的?
- SpringBoot_10_打成jar包后使用外部配置文件中的配置来启动工程
- C#检测应用程序重复启动----函数检测(可以在多用户登录情况下检测)