BZOJ 3590: [Snoi2013]Quare
2024-08-29 15:33:50
首先有一个性质,一个双联通图一定可以拆成一个小的双联通子图和一条链
一个点可以视为权值为0的双联通图或者一个点的链
状压DP,枚举子集
O(3^n*n^2)
#include<cstdio>
#include<algorithm>
#define rep(i,x,y) for (int i=x; i<y; i++)
using namespace std;
int cnt,M[1005][1005],H[5005][15][15],last[15],G[5005][15][2],F[5005];
struct node{
int to,next,val;
}e[1000005];
void add(int a,int b,int c){
e[++cnt].to=b;
e[cnt].next=last[a];
e[cnt].val=c;
last[a]=cnt;
}
int main(){
int T;
scanf("%d",&T);
while (T--){
int n,m;
scanf("%d%d",&n,&m);
cnt=0;
for (int i=0; i<n; i++) last[i]=0;
rep(i,0,n) rep(j,0,n) M[i][j]=1e9;
for (int i=1; i<=m; i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
x--,y--;
add(x,y,z);
add(y,x,z);
M[x][y]=min(M[x][y],z);
M[y][x]=min(M[y][x],z);
}
int Max=(1<<n); rep(i,0,Max) rep(x,0,n) rep(y,0,n) H[i][x][y]=1e9; for (int i=0; i<n; i++) H[1<<i][i][i]=0; for (int i=0; i<Max; i++)
for (int S=0; S<n; S++)
for (int T=0; T<n; T++)
if (H[i][S][T]!=1e9){
for (int To=0; To<n; To++){
if (i&(1<<To)) continue;
H[i|(1<<To)][S][To]=min(H[i|(1<<To)][S][To],H[i][S][T]+M[To][T]);
}
} rep(i,0,Max) rep(S,0,n) G[i][S][0]=G[i][S][1]=1e9;
for (int i=0; i<Max; i++)
for (int S=0; S<n; S++)
for (int j=last[S]; j; j=e[j].next){
int T=e[j].to;
if (i&(1<<T)){
if (G[i][S][0]>=e[j].val){
G[i][S][1]=G[i][S][0];
G[i][S][0]=e[j].val;
}
else if (G[i][S][1]>e[j].val) G[i][S][1]=e[j].val;
}
} rep(i,0,Max) F[i]=1e9; for (int i=0; i<n; i++) F[1<<i]=0;
for (int i=0; i<Max; i++)
for (int pre=(i-1)&i; pre; pre=(pre-1)&i){
int now=i-pre;
for (int S=0; S<n; S++)
for (int T=0; T<n; T++){
if (now&(1<<S) && now&(1<<T)){
int Sum=H[now][S][T]+G[pre][S][0];
if (Sum>=1e9) continue;
if (S!=T) Sum+=G[pre][T][0];
else Sum+=G[pre][T][1];
F[i]=min(F[i],F[pre]+Sum);
}
}
}
if (F[Max-1]==1e9) printf("impossible\n");
else printf("%d\n",F[Max-1]);
}
return 0;
}
最新文章
- C# webform上传图片并生成缩略图
- PHPExcel使用体会
- 洛谷P2733 家的范围 Home on the Range
- DDoS攻防战(二):CC攻击工具实现与防御理论
- Tire树
- Qt学习总结-ui篇(二)
- Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素
- Jfinal 入门
- 诺心(LECAKE) | 氪加
- Core Java读书笔记之String
- linux下mysql数据的导出和导入
- 二十一、oracle pl/sql分类一 存储过程
- Kubernetes 1.5安装
- linux小白成长之路6————安装Java+Apache(httpd)+Tomcat
- linux_FTP连接失败
- (转)基因芯片数据GO和KEGG功能分析
- NodeJs针对Express框架配置Mysql进行数据库操作
- 源码分析篇 - Android绘制流程(二)measure、layout、draw流程
- 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
- PyQt QString 与 Python str&;unicode
热门文章
- 事务的隔离级别和mysql事务隔离级别修改
- Java开发笔记(九十七)利用Runnable启动线程
- 超文本传输协议(HTTP)
- js中.toString()和String()的一丢丢区别
- Servlet--HttpServlet
- deb软件安装
- 在SharePoint Online或SharePoint本地列表中缺少功能区
- Python3自动化学习地址
- 解决nginx bind() to 0.0.0.0:80 failed 问题
- UVA11090 Going in Cycle (二分+判负环)