******图论******
文章平均质量分 52
KIJamesQi
这个作者很懒,什么都没留下…
展开
-
hdu 4822 Tri-war(LCA倍增)
题目链接 给出一棵树,n,3≤n≤105个点n,3 \leq n \leq 10^5个点,然后m次讯问,1≤m≤105m次讯问,1 \leq m \leq 10^5,时限是10000ms,显然每次讯问要控制在log级。 每次讯问给出a,b,c三个不同的点,对于每个点求出树上的点到它的距离严格小于到其他两个点的距离的个数。 如果是两个点,可以找到两个点的路径中点,把树分成分别包含a,b原创 2016-09-28 21:23:04 · 878 阅读 · 0 评论 -
联合训练图论场
联合训练图论场题解报告传送门A.Euler题意:略分析:这题主要是先掌握欧拉通路的概念,然后是如何判断图是否存在欧拉通路。欧拉通路:通过图中每条边且只通过一次,并且经过每一顶点的通路。欧拉回路:通过图中每条边且只通过一次,并且经过每一顶点的回路。无向图: 欧拉通路:连通图+只存在0个或者两个度数为奇数的点。 欧拉回路:连通图+所有节点的度数均为偶数。有向图: 欧拉通路原创 2016-05-31 21:15:00 · 3208 阅读 · 0 评论 -
uva10816 Travel in Desert(MST + 最短路)
题意:一群人在沙漠中,给定了n个点,m条路,双向的。每条路有一定的长度且路上的温度也不一样。现在这群人想从s到t去,要使路径中的最高温度最低,有多条路径的情况下选择路程最短的,输出路径,最高温度,路程。思路:算是一道考验代码的图论题,并不是很难。可以想到最高温度最低,就用贪心(MST)直到s,t连通和保留温度t相同的边。 然后在这些边上做最短路并保存路径打印出来。/****************原创 2016-05-14 11:12:14 · 398 阅读 · 0 评论 -
hdu3639 Hawk-and-Chicken
题目大意n个人相互投票,这投票关系是可以传递的。A投B,B投C,那么C就获得了两票。分析同一个强连通分量的人的票数等于点数减一。现在就缩点,然后逆向建图,从入度为0的点开始搜索。题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2016/5/25File Nam原创 2016-05-25 22:08:34 · 640 阅读 · 0 评论 -
欧拉回路的判定(Fleury算法)
定理:(一)一个图有欧拉回路当且仅当它是连通的且每个顶点都有偶数度。(二)一个图有欧拉通路当且经当它是连通的且除两个顶点外,其他顶点都有偶数度。在第二个定理下,含奇数度的两个节点中,一个必为欧拉通路起点,另一个必为欧拉通路的终点。设G是一个无向的欧拉图,求G中的一条欧拉回路的算法为:(1)任意选取G中的一个点V0,令P0 = V0。(2)假设沿pi = v0e1v1e2v2原创 2015-09-21 15:00:28 · 4709 阅读 · 0 评论 -
lightoj1063 Ant Hills
思路:无向图中割点个数的判定。直接Tarjan抛一边就好了。如果u是这个搜索树的根且有多个儿子节点,,,那么这个根是割点,因为去掉这个点后,他的儿子间是不能连通的。如果u 不是根,如果它的某个儿子节点low[v] >= dfn[u]那么u也是一个割点。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include原创 2015-11-30 17:46:19 · 363 阅读 · 0 评论 -
poj3020(最小边覆盖)
思路:要安放一下类似雷达之类的东西,相邻的一个点会被覆盖,但是,只能覆盖一个,不管是东西南北,那么另外一个被覆盖的点就不用在安放雷达了,求最少的安放雷达的数目;显然就是最小边覆盖问题;对每个坐标表定一个固定的数字,然后根据题意建图;题目链接/*****************************************Author :Crazy_AC(JamesQi原创 2015-09-23 17:02:50 · 523 阅读 · 0 评论 -
hdu2883(DINIC最大流)
思路:同hdu3572一样的模型。有n个客人,没人点了ni个烤肉串,其中没串需要ti的时间来烤熟,但是可以不是连续的ti时间,只要烤得时间加起来有ti就好了,与3752不同的是时间范围有点大,需要离散化一下,所以变成了区间。对起始时间排序去重,那么可以得到top个时间点,也就是top个区间,那么对于每个客人的时间要求,只要客人的要求[s,e] 完全包含了第i个区间,那么该客人与这个区间连边,容量i原创 2015-10-14 17:54:04 · 419 阅读 · 0 评论 -
hdu3572(DINIC最大流)
思路:n个任务,m台机器,每个任务有起止时间,和需要的时间,每个机器同一段时间内只能执行一个任务,一个任务在同一时间内只能被同一机器执行,中途可被打断;每天每台机器是能完成一天的工作量,把这个工作量作为流量比较合理。题目中有三个量,时间,机器,任务。根据题意,每天我m台机器可以完成m天的任务量,所以图中只需要有任务,时间即可。源点和任务连边,容量p,任务和对应的时间连边,容量1,时间和汇点原创 2015-10-14 16:29:26 · 500 阅读 · 0 评论 -
poj2531(trie + 欧拉路径判定)
思路:这问题显然是要判断欧拉路径的存在,然后要把串看成一个点,然后统计串的种类(trie树),最后就是并查集来判断连通性 + 度的判断(无向图的欧拉路径 == 度为奇数的点的个数要么为0,要么为2,不然不存在欧拉路径,这个是一个充要条件)点击题目链接/*****************************************Author :Crazy_AC(Jame原创 2015-09-23 21:37:06 · 456 阅读 · 0 评论 -
poj2485(MST)
QAQ点击题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************************/// #pragma comment(linker, "/STACK:1原创 2015-09-23 17:58:22 · 561 阅读 · 0 评论 -
poj1789(MST)
思路:题目的意思就是求解一个源点到所有点距离之和最小,然后就是这个距离怎么计算就是两个字符串对应位置上不同字母的个数的多少,然后跑kruskal;点击题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*********原创 2015-09-23 17:31:40 · 366 阅读 · 0 评论 -
poj2226(最小点覆盖)
思路:前面有个类似的模型,就不多说了;(此等二分图经典模型)ps:link & vis数组开小了,然后就是各种悲剧的事情;/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************原创 2015-09-21 17:13:29 · 364 阅读 · 0 评论 -
LoghtOj1201(最大独立集)
思路:一哥们要去杀人,这些人之间呢有相互认识的,也有不认识的,如果杀了A,那么认识A的人就回得到消息然后有所防范,问最多能杀多杀人,这显然就是最大独立集。/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :***************原创 2015-09-21 15:41:26 · 415 阅读 · 0 评论 -
hdu2647拓扑排序(逆向)
思路:分层拓扑;题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************************/// #pragma comment(linker, "/STAC原创 2015-09-20 21:05:03 · 423 阅读 · 0 评论 -
hdu1285(拓扑排序)
思路:从样例来看,应该每次找一个入度为0的点,然后更新相邻节点,注意题目说的最后一个数后面没有空格。题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :**********************************原创 2015-09-20 21:23:01 · 411 阅读 · 0 评论 -
poj1470Closest Common Ancestors(LCA模版)
就是一个板子,sum[lca(u, v)]++就好了。const int LOGN = 11;const int maxn = 1 << LOGN;int head[maxn], nxt[maxn], pnt[maxn], ecnt;int sum[maxn], mark[maxn];int dep[maxn];int fa[LOGN][maxn];void addedge(int u,原创 2016-06-24 14:09:58 · 707 阅读 · 0 评论 -
hdu2460 Network
思路:题目的意思是要求在原图中加边后桥的数量,首先我们可以通过Tarjan求边双连通分量,对于边(u,v),如果满足 low[v]>dfn[u],则为桥,这样我们就可以知道图中桥的数目了。对于每一次query,可以考虑dfs树,树边肯定是桥,然后连 上u,v这条边之后,就会形成一个环,这样环内的边就不是割边了,所以只要找到u,v的LCA,把这个路径上的桥标记为否就可以了。const int ma原创 2016-06-24 16:10:01 · 725 阅读 · 0 评论 -
poj3310Caterpillar(树直径)
1.连通性 2.树 3.求直径struct UNION { int F[101]; void init(int n = 0) { memset(F, -1,sizeof F); } int find(int u) { return F[u] == -1?u:F[u] = find(F[u]); } bool原创 2016-06-23 15:36:30 · 640 阅读 · 0 评论 -
poj1659 Frogs' Neighborhood(havel算法)
实质就是贪心,从度数大的开始。struct node { int deg; int id; bool operator < (const node& rhs) const { return deg > rhs.deg; }}p[11];int mp[11][11];void solve(int n) { bool flag = true;原创 2016-06-23 14:53:19 · 398 阅读 · 0 评论 -
poj1419Graph Coloring(一般图最大独立集或着最大团)
一般图的最大独立集和最大团是等效的。图G = (V, E),其补图G’。G的最大独立集等价于G’的最大团。度娘 一般的做法就是搜索。// 最大独立集做法vector<vector<int> > G;int n, m;int color[123];vector<int> rec;int maxnum;void dfs(int u,int _count) { if (_count原创 2016-06-23 13:30:05 · 3852 阅读 · 0 评论 -
hdu3191 How Many Paths Are There(次短路计数dp)
次短路好算,这题多了个计数; dp[u][1],dis[u][1]分别表示到u最短的路径条数和最短路的长度; dp[u][2],dis[u][2]分别表示到u次短的路径条数和次短路的长度; if (dis[u][kind] + cost[u][v] < dis[v][1]) 表示可以更新最短,那么同时次短也会被原来的最短所更新掉,产生了两个新状态,都要添加到队列中。 else if (原创 2016-07-08 12:14:05 · 674 阅读 · 0 评论 -
hdu5409 CRB and Graph(bcc)
题目中critical的定义:对于边e<u,v>e<u, v>成为critical边的充要条件是删除这条边之后u、v不连通了,由于这图是无向图,所以显然是桥边。然后针对桥边构造一条边,使得删除边e<u,v>e<u,v>之后,u、v还是连通的。要求u v,u⪇v,u \ v,u \lneq v,u尽量的大,其次v尽量的小。分析: 1.e<u,v>e<u,v>不是桥边,那么就是0 0. 2.e原创 2016-07-18 22:38:00 · 526 阅读 · 0 评论 -
uvaLive6044 Unique Path(双连通分量的应用)
题意无向图中,求有多少对节点之间的路径是唯一的且边部重合。题目中有详细解释。分析给的几个例子很明确了。只有树结构才有路径不重合。const int maxn = 1e4 + 10;int dfn[maxn], low[maxn], depth;bool in[maxn];bool mark[maxn];vector<vector<int> > G;stack<int> st;void原创 2016-06-22 20:23:46 · 427 阅读 · 0 评论 -
uva610 Street Directions(无向图桥的应用)
题意有一张道路交通图,每条边都是双向的,且连通。现在想尽量把一些多的道路改成单向的,且任意两点是可达的,输出改造后的道路图。分析同一个双连通分量里面的边都是可以通过重定向使得相互可达,可以改成单向边。桥边就只能是双向的了。const int maxn = 1010;int dfn[maxn], low[maxn], depth;int belong[maxn], block;stack<i原创 2016-06-22 19:50:29 · 456 阅读 · 0 评论 -
lightoj 1168-Wishing Snake(Tarjan的应用)
题意从起点出发,一条路径经过所有点。分析因为是有向图,且点是可以重复经过的,所以就会想到强连通分量,分量里面的点是相互可达的,可以看成一个点,这样就可以缩点了。缩点后的图形成一条简单的链且链头是0号点即可。int nCase = 0;int dcmp(double x){//精度正负、0的判断 if (fabs(x) < eps) return 0; return x < 0原创 2016-06-22 16:00:34 · 493 阅读 · 0 评论 -
Lightoj-1330 Binary Matrix(网络流+构造)
题目链接 给定一个r*c的01矩阵,但是只给了每行和每列的和,问能不能构造一个01矩阵出来;如果能救出最小字典序的01矩阵。 首先判断所有行的和是否等于所有列的和,不等就直接impossible结束了。 然后建图就是套路了。建立一个超级原点vs=0,超级汇点vt=r+c+1; 然后是行号[1,r],列号[r+1,r+c]。w[vs][row] = row[i],w[col][vt]转载 2016-07-18 20:25:41 · 532 阅读 · 0 评论 -
hdu1827 Summer Holiday(scc应用)
因为联系是单向的,且具有传递性,所以一个边强连通分量里面最多只需要通知一个人,那么就取代价最小的那个。然后就缩成DAG图,找入度为0的点就好了。const int maxn = 1001;int head[maxn], pnt[maxn<<2], nxt[maxn<<2], ecnt;int dfn[maxn], low[maxn], depth;int indeg[maxn];int Mi原创 2016-07-07 14:30:19 · 327 阅读 · 0 评论 -
poj2762 Going from u to v or from v to u?
对于任意两个点x,y要存在一条x->y或者y->x的路径。显然是缩点然后判断是不是一条链。const int maxn = 1010;int n, m;vector<vector<int> > G;int dfn[maxn], low[maxn], depth;int belong[maxn], block;int in[maxn], mark[maxn];stack<int> st;原创 2016-07-04 14:41:39 · 373 阅读 · 0 评论 -
poj2112 Electricity(割点应用)
给定一张无向图,求删除某个点后图形成的连通快数目,求最大。 邻接表会TLE。。。 统计每个割点所连接的双连通数目,和全部有多少个连通快。const int maxn = 10010;// vector<vector<int> > G;int head[maxn], pnt[maxn<<2], nxt[maxn<<2], ecnt;int dfn[maxn], low[maxn], de原创 2016-07-03 11:22:49 · 362 阅读 · 0 评论 -
poj3189 Steady Cow Assignment(枚举+多重匹配)
有n头牛和b个棚,每个棚有容量上限。每头牛对每个棚有个喜欢程度,现在给牛分配住棚且棚中牛的数目不能超过该棚的上限。 先输入n,b。然后n行,每行有b个数字x[j],表示该头牛对棚子x[j]的喜欢程度是j。现在求一种分配方法使得任意两头牛对所在棚的满意程度的差值最小,输出最小差值。方法:枚举棚子满意度的上下限[low, high],然后做多重二分图匹配。const int maxn = 1010原创 2016-07-02 22:57:32 · 414 阅读 · 0 评论 -
lightoj1321Sending Packets
传送门题意一个大小为s的数据包需要在一张图上从0点传送到n-1点去,每条边有个传输成功的概率p<u,v> = p<v, u>。开始是先传送1的数据,如果成功到达n-1点的话,那么这条路就同了,剩下的数据就可以一直用这条路径来传递而且成功率为1.0。如果没能成功到达,就继续传送1的数据,直到成功为止。求最小传输完的时间期望。分析只要成功传输一次,剩下的就能快速传输,不计时间。那么求最原创 2016-06-09 23:08:55 · 594 阅读 · 0 评论 -
poj3281Dining
传送门题意有N头牛,F种吃的,D种喝的。每头牛都有自己钟意的多种食物和饮料。但是每样只能选一个。每种食物和饮料对外只提供一次。比如A,B都喜欢C这种食物,如果A要了,B就不能再选用。问最多有多少头牛可以同时享用自己钟意的食物和饮料。分析建立超级源点s和汇点t。然后将牛拆点,放在中间如:s->F[i]->N[k]->N[k + N]->D[j]->t这样建立图,每条边的容量为1即可,然后就是最原创 2016-06-09 22:33:08 · 442 阅读 · 0 评论 -
uva10720(Graph Construction)贪心+havel定理
思路:这题主要就是运用havel定理进行贪心,判断一个序列是否可图化。// #pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #include #include #include #inc原创 2015-10-23 10:07:08 · 490 阅读 · 0 评论 -
hdu3861(tarjan缩点 + Hungary)
题意:给出一张有向图,要求你将这些点进行划分,划分依据如下1.如果两个点互相可达,那么这两个点必须在同一个集合中;2.同一个集合中的两个点u,v要满足要么u->v || v->u;3.一个点只能被划分到同一个集合;问最少能划分成几个集合思路:对于条件一就是强联通分量;对于条件2,3得话就要球出来最小路径覆盖,所以可以将所有的强联通分量进行缩点,桥作为连接,然后匈牙利一下,求原创 2015-09-20 00:30:43 · 472 阅读 · 0 评论 -
hdu1669杰米的电话联系人(多重匹配)
题意:杰米想给手机里面的联系人分组,问最大分组中的规模最小,给了每个联系人可能所在组的编号;思路:显然是一个多重匹配问题,x(联系人),y(组编号);一般来说,对最大限制的选取(这里是“最大分组中的规模最小”)通常采用二分搜索来降低搜索空间;具体搜索做法和Hungary()差不多,变的就是cy[maxn]变成cy[maxn][maxn],同时用num[i]来表示与y[i]匹配的x[...]的数原创 2015-09-18 19:34:58 · 617 阅读 · 0 评论 -
hdu1179最大匹配
思路:太模板化了,,,好不习惯QAQ题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************************/// #pragma comment(link原创 2015-09-11 12:56:07 · 351 阅读 · 0 评论 -
hdu1151最小路径覆盖
思路:一个士兵只能访问邻近的点,但是不能回头,相当于是访问一条边,问最少需要的士兵数;显然就是一个最小路径覆盖问题;ps:最小路径覆盖数 = 顶点数 - 最大匹配数;时间效率:O(V * E)题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2原创 2015-09-11 12:31:34 · 324 阅读 · 0 评论 -
hdu2444二分图判定 + 最大匹配
思路:用染色法进行二分图判定,相邻的两个点间染不同的颜色,如果遇见相同的颜色,则不是二分图;不是二分图的话输出No,否则跑Hungary求最大匹配;点击打开链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :******原创 2015-09-11 19:50:00 · 500 阅读 · 0 评论 -
hdu2063二分图
思路:最裸二分图,没有之一。。。。题目链接/*****************************************Author :Crazy_AC(JamesQi)Time :2015File Name :*****************************************/// #pragma comment(linke原创 2015-09-11 13:10:14 · 382 阅读 · 0 评论