HDOJ 3435 - A new Graph Game 无向图分割成若干哈密顿回路(二分图最小权匹配,最小费用最大流).
来源:互联网 发布:如何查看ftp的端口号 编辑:程序博客网 时间:2024/05/01 07:09
题意:
给一个无向图..问能否去选择一些边组成若干个哈密顿回路..如果可以..请输出这些边之和的最小值
题解:
和有向图的差不多了...一个点拆成起点和终点...点与点之间的边注意要做两条..然后跑最小费用最大流..如果最大流不等于点数n..则是NO...否则就输出最小费用
Program:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<math.h> #include<queue> #define MAXN 5005 #define MAXM 500005 #define oo 1000000007 #define ll long long using namespace std; struct MCMF { struct node { int x,y,c,v,next; }line[MAXM]; int Lnum,_next[MAXN],pre[MAXN],dis[MAXN],flow,cost; bool inqueue[MAXN]; void initial(int n) { Lnum=-1; for (int i=0;i<=n;i++) _next[i]=-1; } void addline(int x,int y,int c,int v) { line[++Lnum].next=_next[x],_next[x]=Lnum; line[Lnum].x=x,line[Lnum].y=y,line[Lnum].c=c,line[Lnum].v=v; line[++Lnum].next=_next[y],_next[y]=Lnum; line[Lnum].x=y,line[Lnum].y=x,line[Lnum].c=0,line[Lnum].v=-v; } bool SPFA(int s,int e) { int x,k,y; queue<int> Q; while (!Q.empty()) Q.pop(); memset(dis,0x7f,sizeof(dis)); memset(inqueue,false,sizeof(inqueue)); Q.push(s); dis[s]=0,pre[s]=-1; while (!Q.empty()) { x=Q.front(),Q.pop(),inqueue[x]=false; for (k=_next[x];k!=-1;k=line[k].next) if (line[k].c) { y=line[k].y; if (dis[y]>dis[x]+line[k].v) { dis[y]=dis[x]+line[k].v; pre[y]=k; if (!inqueue[y]) { inqueue[y]=true; Q.push(y); } } } } if (dis[e]>oo) return false; flow=oo,cost=0; for (k=pre[e];k!=-1;k=pre[line[k].x]) flow=min(flow,line[k].c),cost+=line[k].v; cost*=flow; for (k=pre[e];k!=-1;k=pre[line[k].x]) line[k].c-=flow,line[k^1].c+=flow; return true; } void MinCostMaxFlow(int s,int e,int &Aflow,int &Acost) { Aflow=0,Acost=0; while (SPFA(s,e)) { Aflow+=flow; Acost+=cost; } } }T; int main() { int C,cases,i,x,y,d,n,m,s,e,Af,Ac; scanf("%d",&C); for (cases=1;cases<=C;cases++) { scanf("%d%d",&n,&m); s=n<<2,e=s+1,T.initial(e); for (i=1;i<=n;i++) T.addline(s,i<<1,1,0),T.addline(i<<1|1,e,1,0); while (m--) { scanf("%d%d%d",&x,&y,&d); T.addline(x<<1,y<<1|1,1,d),T.addline(y<<1,x<<1|1,1,d); } T.MinCostMaxFlow(s,e,Af,Ac); printf("Case %d: ",cases); if (Af==n) printf("%d\n",Ac); else printf("NO\n"); } return 0;}
- HDOJ 3435 - A new Graph Game 无向图分割成若干哈密顿回路(二分图最小权匹配,最小费用最大流).
- HDOJ 3488 - Tour 有向图分割成若干哈密顿回路(二分图的最小权匹配,最小费用最大流)...
- hdoj 3435 A new Graph Game 【无向图判断权值最小哈密顿环】【KM算法】
- hdu A new Graph Game (最小权匹配/费用流)
- hdu 3435 A new Graph Game(最小费用最大流)
- hdu 3435 A new Graph Game(最小费用流)
- HDU 3435 A new Graph Game(最小费用最大流)&HDU 3488
- 最小哈密顿回路
- HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
- HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
- HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
- hdoj 1853 Cyclic Tour 【最小费用最大流 or KM算法】【构图后可以判断图中是否存在哈密顿环】
- HDU 3435A new Graph Game(网络流之最小费用流)
- 无向图最小费用最大流+uva10594
- poj2195(二分图最大匹配,最小费用流)
- HDU 1853 Cyclic Tour【最小费用最大流 OR 带权二分图匹配】
- HDU 1533Going Home(KM算法求二分图最小权匹配或者最小费用最大流)
- 无向哈密顿图回路Dirac 定理证明和竞赛图为哈密顿通路的证明过程
- Mysql 体系结构系列之九
- TechExcel Devsuite9.2.1 新版本发布
- HDU 1198Farm Irrigation(并查集)
- build/envsetup.sh的简介
- Android 漂亮的 Dialog (弹出框)
- HDOJ 3435 - A new Graph Game 无向图分割成若干哈密顿回路(二分图最小权匹配,最小费用最大流).
- delphi 读写文本文件
- QT4.5.2移植MC100环境搭建步骤
- android dalvik heap 浅析
- C#入门经典—第八章
- fpga分配引脚
- Android动画学习笔记-Android Animation
- SQL连接池
- HDU 1686