首先有一个性质,一个双联通图一定可以拆成一个小的双联通子图和一条链

一个点可以视为权值为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;
}

  

最新文章

  1. C# webform上传图片并生成缩略图
  2. PHPExcel使用体会
  3. 洛谷P2733 家的范围 Home on the Range
  4. DDoS攻防战(二):CC攻击工具实现与防御理论
  5. Tire树
  6. Qt学习总结-ui篇(二)
  7. Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素
  8. Jfinal 入门
  9. 诺心(LECAKE) | 氪加
  10. Core Java读书笔记之String
  11. linux下mysql数据的导出和导入
  12. 二十一、oracle pl/sql分类一 存储过程
  13. Kubernetes 1.5安装
  14. linux小白成长之路6————安装Java+Apache(httpd)+Tomcat
  15. linux_FTP连接失败
  16. (转)基因芯片数据GO和KEGG功能分析
  17. NodeJs针对Express框架配置Mysql进行数据库操作
  18. 源码分析篇 - Android绘制流程(二)measure、layout、draw流程
  19. 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
  20. PyQt QString 与 Python str&amp;unicode

热门文章

  1. 事务的隔离级别和mysql事务隔离级别修改
  2. Java开发笔记(九十七)利用Runnable启动线程
  3. 超文本传输协议(HTTP)
  4. js中.toString()和String()的一丢丢区别
  5. Servlet--HttpServlet
  6. deb软件安装
  7. 在SharePoint Online或SharePoint本地列表中缺少功能区
  8. Python3自动化学习地址
  9. 解决nginx bind() to 0.0.0.0:80 failed 问题
  10. UVA11090 Going in Cycle (二分+判负环)