图论
文章平均质量分 74
LiWen_7
这个作者很懒,什么都没留下…
展开
-
拓扑排序
一、概述 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(TopoiSicai Order)的序列,简称拓扑序列。注意: ①若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从转载 2012-02-27 16:21:33 · 42125 阅读 · 4 评论 -
poj 2117 Electricity (无向图割点去除后最大连通分支数)
题意:求去除一点后,形成的连通分支数的最大值。(使最多的网络不能跟原路线相连)顶点u是割项当且仅满足 (1) 或 (2)时:(1) 若u是树根,且u的孩子数 son>1 。因为没有u的后向边,以这些孩子为根的子树之间互不相连通,所以去掉u后将得到son个分支。(2)若u不是树根,且存在树边 ( u , v ) 使low ( v ) >= dfn ( u )。low值说明原创 2012-08-29 11:44:39 · 3258 阅读 · 0 评论 -
poj 1144 Network (无向图求割点)
#include#include#includeusing namespace std;vector vec[110];int dfn[110] , low[110],in[110];int n, step , sum ;void init(){ for(int i=0;i<110;i++) { dfn[i]=low[i]=in[i]=0; v原创 2012-08-31 15:13:55 · 1199 阅读 · 0 评论 -
hdu 1827 Summer Holiday (强连通Kosaraju法)
题意: 输入n、m ,n表示人数和联系对数。联系不同人的花费不同,需要找到花费最少为多少。思路:找到强连通分支(标记同一分支中的点),然后每个分支中最多只需要联系一个人即可,但若两个分支中有联系则只需联系其中一个花费小的,即将每个分支看做一个点,找分支间的出、入度关系。#include#include#define size 1010#define INF 1000000000原创 2012-08-16 10:48:31 · 1583 阅读 · 0 评论 -
Tarjan 算法
[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}转载 2012-08-24 15:54:14 · 546 阅读 · 0 评论 -
hdu 1827 Summer Holiday (Tarjan算法)
#include#includeusing namespace std;int stack[1010],top ,size, step ,color;int in[1010],dfn[1010],low[1010];int rd[1010],price[1010],sum,num;struct E{ int v, next;}e[2010];int head[1010原创 2012-08-24 16:17:55 · 709 阅读 · 0 评论 -
hdu 2767 Proving Equivalences (tarjan + 缩点)
/*题目大意:给定一张有向图,问最少添加几条边使得有向图成为一个强连通图。解题思路:缩点后找入度为0的点和出度为0的点,统计个数,选择大的那个数就是答案。 如果出度为0的个数n比入度为0的个数m多,那添加n条边,从当前出度为0的点到 其他入度为0的点,肯定能成为强连通图,同理可得m大也可以。(各连通分支间 可能需要1条或2条,才能使两个连原创 2012-08-25 01:33:26 · 550 阅读 · 0 评论 -
poj 2186 Popular Cows (tarjan + 缩点)
题意 :n头奶牛,m组关系(a b代表a认为b受欢迎)。求最后有多少头奶牛所有奶牛都认为它受欢迎。思路:首先用tarjan算出连通分支数,将所有点都标上所属连通分支color。将每个分支看做一个点,若某点a受到另一点b联系,则说明该点a代表的连通分支中每个原始点都受到b中以及所有认为b受欢迎的点的欢迎,所以此处用dfs计算出每个分支中被多少人欢迎。代码(比较繁琐):#inc原创 2012-08-25 16:29:46 · 557 阅读 · 0 评论 -
hdu 3394 (无向图求块 判断环)
题意描述: 公园有n个景点,公园的管理员计划要建m条道路,并且安排一些形成回路的参观路径,如果一条道路可以被多条回路共用, 那么这条边是冲突边,如果一个块中有多个环,则该块中的每条边都是冲突边。 如果不能形成环的路则为不需要的边,现在就是求无向图中冲突边和不需要边的条数解题思路: 把图分为多个块,然后判断每个块里面的边数,如果块的边数原创 2012-08-27 15:56:11 · 1641 阅读 · 0 评论 -
hunnu 11082 The Minesweeper Game(BFS)
题目来源 : http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11082广度搜索bfs 最后输出的不为“#”的部分,实际上是指1、(点击处若为0)处于此处八个方向内且为0(相当于一个“感染区”)并且这个“感染区”的八个方向除了是0的情况,就必须被不为0且不为地雷的包围)。所以,从点击原创 2012-03-26 20:28:58 · 494 阅读 · 0 评论 -
3478 Catch (判断是否为二分图,dfs奇偶染色)
题意:给出一个无向图,一个起点,问是否在某个时候,这个人有可能在所有点都可以出现人不能停留在原地只有当该无向图中出现由奇数个点组成的环,才可能访问每个点时即可能为奇数又可能为偶数。所以:如果我们把图中奇数时刻能够到达的点归到X集合,偶数能到点归到Y集合,那么如果图中出现相同集合的点有 边相连,那么就不满足二部图的性质,即可输出Yes,如果原图可二部图话,答案就是No了(无向图G为二部图原创 2012-07-31 21:48:19 · 2376 阅读 · 0 评论 -
hdu 2647 Reward 拓扑排序
#include#include#include#define size 10010using namespace std;int n,m ,top ,ans;struct E{ int v,next;}e[size*2];struct EE{ int dep , rd , head;}node[size];void insert(int u , int v)原创 2012-08-10 18:03:46 · 568 阅读 · 0 评论 -
最短路径之Dijkstra算法详细讲解
1 最短路径算法在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括:(1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。(2)确定终点的最短路径问题:与确定起点的问题相反,转载 2012-03-24 10:00:17 · 737 阅读 · 0 评论 -
hdu 1171 母函数 和 DP
母函数:#include#includeusing namespace std;typedef struct { int v; int m;}P;int c1[250010],c2[250010];int main(){ int n; P a[110]; int sum; int avg; while (scanf("%d",&n)!=EOF&&n>0) {原创 2012-05-12 22:31:18 · 556 阅读 · 0 评论 -
次小生成树
给出一个带边权的无向图G,设其最小生成树为T,求出图G的与T不完全相同的边权和最小的生成树(即G的次小生成树)。一个无向图的两棵生成树不完全相同,当且仅当这两棵树中至少有一条边不同。注意,图G可能不连通,可能有平行边,但一定没有自环(其实对于自环也很好处理:直接舍弃。因为生成树中不可能出现自环)。【具体题目】URAL1416(注意,这一题的边数M的范围没有给出,视为124750)【分析】转载 2012-05-24 08:27:04 · 572 阅读 · 0 评论 -
最小生成树 (Kruscal 、prime)
Kruscal:/*思想:该算法每次从所有未使用边中,找出权值最小的边,加入到生成树中,直到加入V-1条边(V是顶点数),构成一颗MST。*/#include#include#includeusing namespace std;typedef struct { int u,v; int w;}Edge;Edge e[1010];int fa[1010];bool原创 2012-05-26 17:01:39 · 1306 阅读 · 0 评论 -
树的分治 poj 1741
求树的重心结点:用标号定义树的重心,对于一个结点K,如果把K从树中删除(连同与它相连的边一起),剩下的被分成了很多块,每一块显然又是一棵树(即剩下的部份构成了一个森林)。则给结点K所标的号就是森林中结点个数最多的树所拥有的结点数。如果结点K的标号不大于其它他任何一个结点的标号,则结点K被称为是树的重心。从树种找到重心,在以每个重心分为的森林找每棵树的重心,每找到一个重心,就原创 2012-07-09 16:29:38 · 1257 阅读 · 0 评论 -
POJ 1003 判断欧拉回路
题意:有N个房间,每个房间都有若干门通往相应编号的房间(这些开着的门都是由房子主人经过时打开的,所以说明这些房间一定是连通的。),问是否能从编号为M的房间出发,经过所有的房间把所有的门都关闭最后回到0号房间,同时关上的的门不能再被打开。思路:因为各个房间一定是连通的,所以判断是否能够一圈走完所有的路,则以房间为点,门为边的图必定是欧拉回路(有限图G是一条道路(即可以一笔画成)的充分必要条件是G原创 2012-08-07 16:13:06 · 4519 阅读 · 0 评论 -
2489 Minimal Ratio Tree 最小生成树(选边)
题意: 给n个点及各点间的距离,从中选出m个点 ,使得 边权的和 / 点权的和 最小。思路: 从n个点中选出m个点(枚举每种可能的情况),计算出它的。。。最小值。所以可以用dfs枚举出各种情况,再用prime算出每种情况的。。。最小值。#include#include#define INF 999999using namespace std;int map[20][20原创 2012-08-10 10:29:04 · 863 阅读 · 0 评论 -
hdu 1285 确定比赛名次
题意: 拓扑排序,按字典序输出。 #include#include#include#includeusing namespace std;int n,m , top;int vis[510][510];int ans[510];struct E{ int v, next;}e[20010];struct N{ int head , dep ,原创 2012-08-13 10:52:13 · 672 阅读 · 0 评论 -
hdu 1811Rank of Tetris (并查集+拓扑排序)
题意: n个队,m种描述(a>b 或 a=b 或 aa同时存在;②:存在环),信息是否不齐全(排名顺序有多种可能:某次入度为0的>1个。)思路: 由于当存在冲突和信息不全时,返回冲突。所以先用并查集将‘=’两边的点“并为一点”,即只用对其中一点进行排序,将他们的根节点赋值为相同。若后面‘>' 或 'a=b与aa同时存在;若该冲突则用拓扑排序将比分顺序排列出来(当排序过程中出现入度为0的个数某次原创 2012-08-13 15:54:26 · 924 阅读 · 0 评论 -
poj 1523 SPF (无向图 求割项)
题意: 求有多少个割项,且每个割项被几个块所共有。代码:#include#include#include#define mm 1010using namespace std;vector vec[mm];int stack[mm] , low[mm] , dfn[mm] ,gd[mm];int top , step ,n , m ,xx;void init(){原创 2012-08-27 18:11:11 · 947 阅读 · 0 评论