无向图变成二分图
来源:互联网 发布:mac 远程看windows 编辑:程序博客网 时间:2024/06/05 16:45
给出一个无向图G,图上的点有权值。要求将G组织成一个二分图,使得同侧的点之间没有边相连,并且两侧点权总和之差最小。
转化为0-1背包问题。
#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>#include<iostream>#include<math.h>#include<vector>#include<stack>using namespace std;const int offset=2010;const int maxdiff=offset*2+1;const int maxn=110;bool diff[2][maxdiff];int num[maxn][2];struct Node{int w;bool visited;}node[maxn];int n;int tot;char edge[maxn][maxn];void dfs(int root,int part){num[tot][part]+=node[root].w;node[root].visited=true;for(int i=0;i<n;i++){if(edge[root][i]=='1'&&!node[i].visited){dfs(i,1-part);}}}int main(){while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++){scanf("%d",&node[i].w);node[i].visited=false;}for(int i=0;i<n;i++){scanf("%s",edge[i]);}tot=0;memset(num,0,sizeof(num));for(int i=0;i<n;i++){if(!node[i].visited){dfs(i,0);tot++;}}int u=0,v=1;memset(diff[u],0,sizeof(diff[u]));diff[u][offset]=true;for(int i=0;i<tot;i++){memset(diff[v],0,sizeof(diff[v]));for(int j=0;j<maxdiff;j++){if(diff[u][j]){diff[v][j-num[i][0]+num[i][1]]=true;diff[v][j+num[i][0]-num[i][1]]=true;}}u=v,v=1-u;}int ans=offset;for(int i=0;i<maxdiff;i++){if(diff[u][i])ans=min(ans,abs(i-offset));}printf("%d\n",ans);}return 0;}
from sysuoj.
阅读全文
0 0
- 无向图变成二分图
- 判断一个无向图是否为二分图
- 判断一个无向图是不是二分图
- poj 3020 Antenna Placement(二分无向图 匈牙利)
- POJ3020-Antenna Placement 无向二分图 匈牙利算法 裸题
- HDU 2444 二分图的判断和无向图的二分匹配
- 图--无向图
- 无向图+BFS
- 无向图+DFS
- 无向图
- 无向图邻接矩阵
- 无向图
- 加权无向图
- 加权无向图
- 邻接矩阵无向图
- 邻接矩阵--无向图
- chapter2-无向图
- 无向图.md
- http://www.cnblogs.com/Ant-soldier/p/5466415.html
- 短信备份
- 使用matplotlib绘制K线图以及和成交量的组合图
- Android图片压缩(质量压缩和尺寸压缩)&Bitmap转成字符串上传
- Java爬虫,信息抓取的实现
- 无向图变成二分图
- Springmvc 注解驱动格式化实例
- 民航标准229D缩写汇总及常识笔记
- 【用Python学习Caffe】3. 图像训练测试数据集LMDB的生成
- Java程序运行和对象创建过程简述
- UESTC 1271 Search gold
- iOS socket 编程
- 如果APP已经启动,在新的task里重新启动APP,不影响原有的task。。。
- CentOS 7 64bit下安装Apache Server过程