连通图+最小树形图+2-sat
文章平均质量分 73
秋天的风--
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
展开
-
poj 2296 二分+2-sat
/*二分+2-sat题意:判断以一个点为边中心的上矩形或下矩形是否存在一组使得没有相交的矩形和hdu 3622 差不多,注意判断矩形相交的方程*/#include#include#include#define eps 1e-10#define N 410struct node {int u,v,next;}bian[N*N];int head[N],dfn[N],low原创 2015-04-29 16:28:27 · 515 阅读 · 0 评论 -
sdibt 1251 进化树问题
/*三个点的话 A--D--B | C dis(AD)=(AB+AC-BC)/2;拓展到到n个点 每次去叶子节点,先去掉与A相连长度最小的。 将他们的长度加起来。*/#include#define N 110int ma[N][N];int main() { int n,m原创 2014-09-26 11:11:46 · 577 阅读 · 0 评论 -
poj 3164 最小树形图模板!!!
/*tle十几次,最后发现当i从1开始时,给环赋值时要注意啊!最小树形图 */#include#include#include#define N 110#define inf 0x3fffffff#define eps 1e-10struct node {int u,v;double w;}edge[N*N*2];double distance (double x,do原创 2014-08-27 16:52:17 · 773 阅读 · 0 评论 -
poj 2553强连通+缩点
/*先吐槽下,刚开始没看懂题,以为只能是一个连通图0T0 题意:给你一个有向图,求G图中从v可达的所有点w,也都可以达到v,这样的v称为sink.求这样的v. 解;求强连通+缩点。求所有出度为0的点即为要求的点。 注意:可能有多个联通分支。*/#include#include#include#define N 5100struct node { int u,v,w,next;原创 2014-08-18 17:26:43 · 648 阅读 · 0 评论 -
hdu 2121无根最小树形图要建一个虚拟节点
#include#include#define inf 999999999#define N 1100struct node {int u,v,w;}edge[11000];int visit[N],dis[N],id[N],pre[N],yong,n,index;void addedge(int u,int v,int w){edge[yong].u=u;edge[yong原创 2014-07-07 20:29:46 · 608 阅读 · 0 评论 -
hdu 4009 最小树形图模板题朱刘算法
#include/*思路:显然对于每个地方,只有一种供水方式就足够了,这样也能保证花费最小,而每个地方都可以自己挖井,所以是不可能出现无解的情况的,为了方便思考,我们引入一个虚拟点,把所有自己挖井的都连到这个点,边权为挖井的花费,而如果i能从j处引水,则从j向i连边,边权为引水的花费,然后对这个有向图,以虚拟点为根,求最小树形图即可(最小树形图即为有向图的最小生成树)。*/#incl原创 2014-07-06 17:08:23 · 564 阅读 · 0 评论 -
hdu 3072 强连通+缩点+最小树形图思想
#include#include#define N 51000#define inf 1000000000struct node { int u,v,w,next;}bian[N*2];int dfn[N],low[N],yong,index,ans[N],visit[N],head[N],stac[N],top,num,n;void init() { yong原创 2014-07-07 10:20:07 · 502 阅读 · 0 评论 -
最小树形图的学习也可以叫 有向图的最小生成树
http://baike.baidu.com/view/5944982.htm?fr=aladdin本词条缺少信息栏、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!最小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T,并且T中所有边的总权值最小。最小树形图的第一个算法是1965年朱永津和刘振宏提出的复杂度转载 2014-07-06 17:12:38 · 1037 阅读 · 0 评论 -
hdu 3594 强连通好题仙人掌图,对自己的tarjan模板改下用这个
#include#include#define N 21000struct node {int v,next;}bian[51000];int yong,dfn[N],low[N],stac[N],top,index,visit[N],ans,flag,mark[N],head[N],pre[N];void init() {//初始化memset(dfn,0,sizeof(dfn)原创 2014-07-05 11:08:56 · 514 阅读 · 0 评论 -
hdu 2242双联通分量+树形dp
/*先求出双联通缩点,然后进行树形dp*/#include#include#include#define inf 0x3fffffff#define N 11000struct node {int u,v,next;}bian[N*4],edge[N*4];int head[N],yong,dfn[N],low[N],index,f[N*4],cnt,n,num[N];int原创 2014-07-25 11:47:33 · 513 阅读 · 0 评论 -
poj 1659 判断是否能构成图Havel-Hakimi定理
//用到了Havel-Hakimi定理,判断是否能够构图//两种情况不能构图,1:对剩下序列排序后,最大的度数超过了剩下的顶点数// 2:对最大的度数后面的f个度数减-后,出现了负数//记录到临街矩阵只需要每次排序后减-记录。#include#include#include#define N 20struct node{ int u,in原创 2014-09-16 15:57:53 · 573 阅读 · 0 评论 -
hdu 2224 双调欧几里得旅行商问题tsp
/*题意:平面上n个点,确定一条连接各点的最短闭合旅程。这个解的一般形式为NP的(在多项式时间内可以求出)建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。每个点都要走一次,且每个点只能走一次,求最短路径;相当于一个人从一个点出发分两条不同的路线走,不过一个走在前面一个在后面走。设dp[i][j]代原创 2014-09-27 21:08:28 · 793 阅读 · 0 评论 -
2-sat相关知识
转载:http://blog.csdn.net/luyuncheng/article/details/15172827此题好纠结啊。。。其实2-sat关键是建边此题网上好多题解都是直接说了建边而且建边完全没有解释清楚,说了的也都是模模糊糊完全不能让人信服啊啊啊啊反正我是没有找到一个能让我完全理解的索性自己想了下,我的建边以及证明如下: 因为公式不转载 2014-10-18 11:36:11 · 617 阅读 · 0 评论 -
poj 3648 2-sat 输出任意一组解模板
/*2-sat问题,题意:有对情侣结婚,请来n-1对夫妇,算上他们自己共n对,编号为0~~n-1,他们自己编号为0所有人坐在桌子两旁,新娘不想看到对面的人有夫妻关系或偷奸关系,若有解,输出一组解,无解输出bad luck思路:1.根据偷奸关系建图(1h和2h有偷奸关系,建边1h->2w 2h->1w)2.求强连通分量3.判断有无解(任一对夫妇不在同一强连通分量中,有解;否则无解)转载 2014-10-19 16:53:40 · 562 阅读 · 0 评论 -
hdu 3622 二分+2-sat
/*二分+2-sat题意:在一个二维平面上给你n个炸弹,和2*n个位置,每一行的两个位置只能有一个放炸弹现在炸弹爆炸有一个半径,当炸弹爆炸时两个炸弹的半径化成的圆不能相交,求最大半径二分半径,每次如果一个炸弹可放的两个位置中的一个与其他位置有矛盾,就进行建边,最后判断是否存在这样一组解即可。*/#include#include#include#define eps 1e-5原创 2014-10-18 16:41:24 · 714 阅读 · 0 评论 -
hdu 1814 2-sat 输出字典最小的和任意序列的 模板题
/*思路:http://blog.csdn.net/string_yi/article/details/12686873hdu 1814 输出字典序最小的2-sat*/#include#include#include#define N 16100#define NN 210000struct node { int v,w,next;}bian[NN*2];int h转载 2014-10-19 16:27:39 · 502 阅读 · 0 评论 -
poj 3683 2-sat问题,输出任意一组可行解
/*2sat问题输出任意一组可行解*/#include#include#include#include#include#includeusing namespace std;#define N 2100struct node {int u,v,next;}ff[N],bian[N*N*8];int head[N],yong,low[N],dfn[N],belong[N原创 2014-11-10 11:53:18 · 1138 阅读 · 0 评论 -
hdu 4115 石头剪子布(2-sat问题)
/*题意:石头剪子布,现在已知n回合bob将会出什么,对alice有限制,对于u,v,w;如果w=0说明a,b回合必须出的一样否则,必须不一样。alice如果输一回合就输了,否则就赢了解:2-satalice有两个选择要么平手要么赢。对于第u回合,alice可以出au,bu;对于第v回合,alice可以出av,bv;当w=0那么第u回合和第v回合必须相同比较au和bu。bv是否矛原创 2014-11-09 16:44:01 · 794 阅读 · 0 评论 -
poj 3678 XOR和OR和AND(简单2-sat问题)
/*题意:给你一些边,每条边有一个值和一个运算符XOR OR AND求是否存在一些点使得所有的边根据这些运算符可以符合条件的权值.建边方式参考:http://blog.csdn.net/shuangde800/article/details/8876533这种建边方式真好,以后就用这种了0 -- 10 -- 01 -- 01 -- 1根据预算符有矛盾就建两条边因为这题原创 2014-11-09 11:40:52 · 900 阅读 · 0 评论 -
hdu 1824 2-sat问题(判断)
/*题意:u,v,w队长,队员,队长留下两个队员可以回家,两个队员留下,队长回家2-sat问题,把两个队员看成一个整体就变成一个简单2-sat问题了*/#include#include#include#includeusing namespace std;#define N 6100#define NN 5100struct node {int u,v,w,next;}原创 2014-11-09 19:19:29 · 545 阅读 · 0 评论 -
hdu 4421 和poj3678类似二级制操作(2-sat问题)
/*题意:还是二进制异或,和poj3678类似建边和poj3678一样*/#include#include#include#define N 2100struct node{int v,next;}bian[N*N];int head[N],dfn[N],low[N],vis[N],stac[N],belong[N],yong,ans,index,top;void init原创 2014-11-09 13:55:43 · 753 阅读 · 0 评论 -
hdu 3062 2-sat
#include#include#define N 2100struct node {int u,v,next;}bian[N*N];int min(int a,int b) {return a>b?b:a;}int yong,dfn[N],low[N],ans[N],stac[N],top,index,num,head[N],visit[N];void a原创 2014-03-01 18:52:57 · 538 阅读 · 0 评论 -
2-sat
HDU】3062 Party1824 Let""s go home3622 Bomb Game3715 Go Deeper1815 Building roads2723 Get Luffy Out1816 Get Luffy Out *1814 Peaceful Commission4115 Eliminate the Con转载 2014-05-26 18:35:47 · 487 阅读 · 0 评论 -
uva 交叉染色法10004
鉴于网上讲交叉染色的资料比较少,于是我把我自己的心得与方法贴出来,方便与大家共同进步。二分图:百度百科传送门wiki百科传送门判断一个图是否为二分图可以用交叉染色的方法来判断,可以用BFS,也可以用DFS,这里我用使用DFS来实现。思路:任意取一个点进行染色,如果发现要涂某一块时这个块已经被涂了色,并且与我们要使用的颜色不同的话,就说明这个图不能被染成BICOLORABLE转载 2014-07-19 16:55:45 · 601 阅读 · 0 评论 -
2767 Proving Equivalences 至少加几条边让全部图变成强连通模板题
#include#include#define N 21000struct node {int u,v,next;}bian[N*3];int head[N],dfn[N],low[N],index,vis[N],stac[N],top,yong,cnt,suo[N],indegree[N],outdegree[N];void init() {yong=0;index=0;top=原创 2014-07-18 20:15:25 · 481 阅读 · 0 评论 -
关于有重边的强连通分量
有向图的的情况比较简单只有一种强连通,重边和连向自己的边对于强连通都没有任何影响无向图的双连通要分点双连通(biconnected)和边双连通(edge_biconnected),连向自己的边对于俩种双连通也没有任何影响,但是重边对点双连通没有影响,但是对于边双连通有影响,因为在求边双连通时,要求对于任意俩点至少存在两条“边不重复”的路径,所以这个时候表示图我们不能用vector了,而是用邻接转载 2014-07-18 17:09:44 · 681 阅读 · 0 评论 -
POJ 3352 无向图边双连通分量,缩点,无重边
为什么写这道题还是因为昨天多校的第二题,是道图论,HDU 4612。当时拿到题目的时候就知道是道模版题,但是苦于图论太弱。模版都太水,居然找不到。虽然比赛的时候最后水过了,但是那个模版看的还是一知半解,主要还是对于无向图缩点不了解。所以今天特意找了道求无向图边双连通分量,然后缩点的题学习一下,这道题的缩点和昨天那道差不多,唯一的区别就是这是无重边的,那题是有重边的。先搞掉这个,下午转载 2014-07-19 09:57:11 · 522 阅读 · 0 评论 -
nyoj 120 建边构强连通
#include#include#includeusing namespace std;#define N 200struct node{ int u,v,next;} bian[N*N];int n,dfn[N],low[N],stac[N],yong,head[N],visit[N],ans,top,inde,suo[N],indegree[N],outdegre原创 2014-05-24 22:37:55 · 502 阅读 · 0 评论 -
网上有一种错误的做法是:因为每一个双连通分量内的点low[]值都是相同的,则dfs()时,对于一条边(u,v),只需low[u]=min(low[u],low[v]),这样就不用缩点,最后求度数的时候
原创 2014-07-19 15:05:09 · 784 阅读 · 0 评论 -
hdu 3836 强连通+缩点:加边构强连通
#include//求出其所有的强连通分量缩点,选出出度和入度最大的那个就是要求的边#include#include#define N 51000struct node { int v,next;}bian[N];int head[N],yong,n,indegree[N],outdegree[N],visit[N],suo[N],dfn[N],f,low[N],index,stac原创 2014-05-16 14:59:06 · 533 阅读 · 0 评论 -
1827 tarjan+缩点
#include#include#include#include#include#includeusing namespace std;#define inf 1000000000#define N 2100vectorh[N];//stackq;///int dfn[N],low[N],index,indegree[N],a[N],visit[N],s原创 2014-02-28 17:13:44 · 478 阅读 · 0 评论 -
poj 2186 强连通+缩点
#include#include#define N 11000int dfn[N],low[N],sta[N],visit[N],suo[N],ans,outdegree[N],pre[N],top,num[N];int head[N],yong,n,m;struct node {int v,next;}bian[N*10];void init() {原创 2014-05-09 10:40:00 · 505 阅读 · 0 评论 -
hdu 3352 求边双联通分量模板题(容器)
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树找叶子节点的个数*/#include#include#define N 1100int top[N],ma[N][N],dfn[N],low[N],index,f[N][N],n;int Min(int a,int b) {return a>b?b:a;}void tarjan(int u,原创 2014-07-19 09:25:54 · 596 阅读 · 0 评论 -
poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树找叶子节点的个数*/#include//用容器写在3177这个题上会超内存,但是用临界表过了#include/*此代码为临界表代码*/#define N 5100struct node {int u,v,next;}bian[N*4];int dfn[N],low[N],index,f[N*4原创 2014-07-19 15:59:53 · 502 阅读 · 0 评论 -
强双联通
【HDU】强连通:1269 迷宫城堡 断定是否是一个强连通2767 Proving Equivalences 至少加几条边让全部图变成强连通3836 Equivalent Sets 至少加几条边让全部图变成强连通1827 Summer Holiday 传递的最小费用3072 Intelligence System 传递的最小费用转载 2014-05-26 18:34:47 · 592 阅读 · 0 评论 -
poj 1523 求割点把一个图分成几个联通部分
#include#include#define N 1100struct node {int u,v,next;}bian[N*N*2];int head[N],dfn[N],low[N],index,cut[N],yong,visit[N],dd[N],len,vis[N];void init() {memset(head,-1,sizeof(head));memset(df原创 2014-07-20 16:10:56 · 722 阅读 · 0 评论 -
poj 2117 去掉割点可以分得的联通图的个数模板
#include#include#define N 11000/*去掉一个割点后,询问可以分得的联通图的个数*/struct node {int u,v,next;}bian[N*100];/*cut数组记录去掉某个节点后可以增加的联通分支的个数,num数组记录以i为根节点的联通图的元素的个数*/int head[N],n,yong,cou,index,dfn[N],low[原创 2014-07-20 14:43:40 · 639 阅读 · 0 评论 -
poj 2942 求点双联通+二分图判断奇偶环+交叉染色法判断二分图
http://blog.csdn.net/lyy289065406/article/details/6756821http://www.cnblogs.com/wuyiqi/archive/2011/10/19/2217911.html#include "stdio.h"#include "string.h"#define N 1010int time;int n,m;bool转载 2014-07-20 12:02:43 · 499 阅读 · 0 评论 -
双联通分量
双连通分量分类: 文摘 2011-10-16 10:22 1393人阅读 评论(0) 收藏 举报算法存储[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。一个图的点连通度的定义为,最小割点集合中的顶点数。 类似的,如果有一个边集合,删除这个边集合以后,转载 2014-07-10 17:44:27 · 737 阅读 · 0 评论 -
Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何求解强连通分量的。 Tarjan算法在求解强连通分量的时候,通过引入dfs过程中对一个点访问的顺序dfsNum(也就是在访问该点之前已经访问的点的个数)和一个点可以到达的最小的dfsNum的low数组,当我们遇到一个顶点的dfsNum值等于low值,那么该点就是一个强连通分量的根。因为我们在dfs转载 2014-07-10 17:28:18 · 650 阅读 · 0 评论