HDU5765 Bonds 最小割极

http://acm.hdu.edu.cn/showproblem.php?pid=5765

题意:无向连通图,问每条边在几个最小割极上

思路:用位压形式,表示边的关系。g[1<<i]=1<<x  表示第i个点与哪几个点相连。然后,处理出每种点集和哪些点相连。每个点构成一个连通图,所以枚举当前点集,可以得到所有连通图的点集,计算出数量,用高维前缀和处理所有包含i点的连通块

ans=(所有连通块-同时包含(i,j)的连通块数目)/2  应为以(i,j)为割边的连通块,删除该边以后,数量加倍,所以除2

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<cstdio>
 6 #include<set>
 7 #include<map>
 8 #include<vector>
 9 #include<cstring>
10 #include<stack>
11 #include<cmath>
12 #include<queue>
13 #include <conio.h>
14 #define clc(a,b) memset(a,b,sizeof(a))
15 #include <bits/stdc++.h>
16 const int maxn = 20005;
17 const int inf=0x3f3f3f3f;
18 const double pi=acos(-1);
19 typedef long long LL;
20 using namespace std;
21 //const LL MOD = 1e9+7;
22 void fre(){freopen("in.txt","r",stdin);}
23 inline int lb(int x){return x&(-x);}
24 const int N=1<<21;
25
26 int g[N],a[N],u[500],v[500];
27 bool vis[N];
28 int sum[N];
29 int main(){
30     int T;
31     scanf("%d",&T);
32     for(int cas=1;cas<=T;cas++){
33         int n,m;
34         scanf("%d%d",&n,&m);
35         for(int i=1;i<1<<n;i++) sum[i]=0,g[i]=0,vis[i]=false;
36         for(int i=0;i<m;i++){
37             int x,y;
38             scanf("%d%d",&x,&y);
39             u[i]=x,v[i]=y;
40             g[1<<x]|=1<<y;
41             g[1<<y]|=1<<x;
42         }
43         for(int i=1;i<1<<n;i++) g[i]|=g[i-lb(i)]|g[lb(i)];
44         int l=0,r=0;
45         for(int i=0;i<n;i++) vis[a[r++]=1<<i]=true;
46         while(l<r){
47            int c=a[l++];
48            int res=g[c]^(g[c]&c);
49            while(res){
50              int tem=lb(res)|c;
51              if(!vis[tem]) vis[a[r++]=tem]=true;
52              res-=lb(res);
53            }
54         }
55         int all=0;
56         for(int i=1;i<1<<n;i++){
57             int j=(1<<n)-1;
58             j^=i;
59             if(vis[i]&&vis[j]){
60                 sum[i]++,sum[j]++,all++;
61             }
62         }
63         for(int j=0;j<n;j++){
64             for(int i=(1<<n)-1;i>=1;i--)
65                 if(!(i&(1<<j))) sum[i]+=sum[i^(1<<j)];
66         }
67         printf("Case #%d: ",cas);
68         for(int i=0;i<m;i++){
69             printf("%d",(all-sum[(1<<u[i])|(1<<v[i])])/2);
70             if(i==m-1) cout<<endl;
71             else cout<<" ";
72         }
73     }
74     return 0;
75
76 }
时间: 2024-07-29 15:20:56

HDU5765 Bonds 最小割极的相关文章

【BZOJ2039】【2009国家集训队】人员雇佣 [最小割]

人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作有一个贡献指数,(我们用Ei,j表示i经理对j经理的了解程度),即当经理i和经理j同时被雇佣时,经理i会对经理j做出贡献,使得所赚得的利润增加Ei,j.当然,雇佣每一个经理都需要花费一定的金钱Ai,对于一些经理可能他做出的贡献不值得

hdoj 4289 Control 【拆点 求最小割】

Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2295    Accepted Submission(s): 961 Problem Description You, the head of Department of Security, recently received a top-secret informati

There is a war (hdu 2435 最小割+枚举)

There is a war Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 970    Accepted Submission(s): 277 Problem Description There is a sea. There are N islands in the sea. There are some directional

HDU 3657 Game(取数 最小割)经典

Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1065    Accepted Submission(s): 449 Problem Description onmylove has invented a game on n × m grids. There is one positive integer on each g

POJ2914 Minimum Cut【全局最小割】【Stoer-Wangner】

题目链接: http://poj.org/problem?id=2914 题目大意: 提一个无向有重边的图,有重边的边权累加起来,求全局最小割. 思路: 一个无向连通图,去掉一个边集可以使其变成两个连通分量则这个边集就是割集.最小割 集当然就是权和最小的割集. 这是一个最简单的全局最小割模板题.直接套上模板就可以了.来说说Stoer-Wangner算 法吧. Stoer-Wangner算法: 对于图中的任意两个顶点u和v,若u,v属于最小割的同一个集合中,那么僵顶点u和顶点 v合并后并不影响图的

HDU 3035 War(对偶图求最小割)

HDU 3035 War 题目链接 题意:根据图那样,给定一个网络,要求阻断s到t,需要炸边的最小代价 思路:显然的最小割,但是也显然的直接建图强行网络流会超时,这题要利用平面图求最小割的方法,把每一块当成一个点,共有边连边,然后每一个路径就是一个割,然后最短路就是最小割了 代码: #include <cstdio> #include <cstring> #include <vector> #include <queue> using namespace s

ZOJ 2587 Unique Attack 判断最小割是否唯一

很裸的判断最小割是否唯一.判断方法是先做一遍最大流求最小割,然后从源点和汇点分别遍历所有能够到达的点,看是否覆盖了所有的点,如果覆盖了所有的点,那就是唯一的,否则就是不唯一的. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostr

AHOI2009最小割

1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1072  Solved: 446[Submit][Status] Description A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤i≤M)条道路连接了vi,ui两个中转站,那么中转站vi可以通过该道路到达ui中转站,如果切断这条道路,需要代价ci.现在B国想找出一个路径切断方案,使中转站s不能到

bzoj1412-网络流最小割

狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆.可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已.所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养. 通过仔细观察,Orez发现狼和羊都有属于自己领地,若狼和羊们不能呆在自己的领地,那它们就会变