![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
keyboarder_zsq
你所认为的极限,其实是别人的起点。
展开
-
hdoj1827
图的强连通,缩点,求个入度为0的点的数量,和入度为0的点集里面最小的花费和。 //很死板的题,模板题的一样的… #include<cstdio>#include<queue>#include<iostream>#include<string.h>#include<algorithm>using namespace std;typedef long long LL;#define IN原创 2016-05-25 15:28:56 · 386 阅读 · 0 评论 -
欧拉回路【判断连通+度数为偶】
* 无向图是欧拉图的充要条件是所有点的度为偶数并且所有点联通*解决是否为偶数很简单,问题似乎变成了判断连通呢? 1.并查集 2.深搜一下就好了并查集:#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#原创 2016-07-07 18:56:23 · 893 阅读 · 0 评论 -
poj2186【利用强连通分量】
题意: 有n头奶牛,然后有个规则是A->B,B->C,那么A->C; A觉得B受欢迎,B觉得C受欢迎,那么A觉得C受欢迎; 求:被其他所有牛都欢迎的牛的数量; 思路: 原来的思路: 我们只要在缩点之后的图中,找出出度为0的点,然后输出它里面的点就可以了。【虽然AC了】 然后我觉得这样不是会有缺陷么?他可能入度也为0呢?也就是缩点后那个出度为0点是独立的。所以还是要判断入度吧。 后来其原创 2016-07-18 19:51:10 · 352 阅读 · 0 评论 -
PTA 朋友圈【并查集的合并问题】
一开始,考虑的是每次就是把第一个作为祖先,这样很明显是错误的,比如 7 4 3 1 2 3 2 4 2 3 5 6 7 1 6 所以这正是更好地体现对于集合的代表。只有把所有的元素合并一下,然后选一个作为代表代表集合,这有点感觉强连通算法。所以后来的比较好的方法,就是每个都并一下,选一个作为代表,因为并的操作是要find的,而find是要找那个boss的,所以很不错诶;#include<原创 2016-07-08 19:00:18 · 791 阅读 · 0 评论 -
2016 Multi-University Training Contest 1Abandoned country
qaq,现在内心真是各种草泥马。怪自己见识短浅。。。哎。。。 题意: 给你一幅图,然后求一个最小花费使得所有的点都连通(这就是最小生成树啊),然后在这棵树上【如果我要从任意起点到任意终点,这两个点不同,且这两个点的被选取概率都是一样,求一个最小的期望长度,我的神队友的解释就是树上所有任意不同点之间的边值都加起来然后除以边的数量】思路: ①:最小生成树; ②:求一个所有边之和/边的数量,一个边原创 2016-07-19 16:48:02 · 908 阅读 · 4 评论 -
poj1724【最短路】
题意: 给出n个城市,然后给出m条单向路,给出了每条路的距离和花费,问一个人有k coins,在不超过money的情况下从1到n最短路径路径。 思路: 我相信很多人在上面那道题的影响下,肯定会想想,在保证最短路的前提下维护下最小花费?还是保证最小花费下维护一个最短路?这样两个想法的bug都非常明显啊。第一个,那是大错特错了,人家首要给你的条件满足<=k,你还抱住最短路长度不放,给你wa是同情。原创 2016-07-20 21:36:11 · 805 阅读 · 0 评论 -
POJ2367【拓扑排序】
很裸的拓扑排序~//#include <bits/stdc++.h>#include<iostream>#include<string.h>#include<cstdio>#include<algorithm>using namespace std;typedef __int64 LL;const int N=1e2+10;int ma[N][N];int pre[N];int n;原创 2016-08-17 23:50:21 · 511 阅读 · 0 评论 -
poj1511【最短路spfa】
题意: 计算从源点1到各点的最短路之和+各点到源点1的最短路之和;思路: 源点这个好做啊,可是各点到源点,转个弯就是反向建边然后求一下源点到各点的最短路,就是各点到源点的最短路,在两幅图里搞;贴一发挫code……….#include <iostream>#include <cstdio>#include <string.h>#include <algorithm>using namesp原创 2016-08-10 21:09:11 · 907 阅读 · 0 评论 -
Codeforces698B【并查集+拆环】
好题,好题,第一次写这个神秘的拆环。。 题意: 给你n个数,第i个数代表点i连向点a[i], 将这副图变成树,求最小改变边的数量; 思路: 已知有向树的定义, 除了根节点外每个节点都有且仅有一条边都指向它的父亲节点, 而根节点有且仅有一条边指向自己。 给出的图类型, 1.环; 2.独立的点; 3.链; 如果是独立的话,就是选定一个根节点然后,让其他根节点指向它; 如果存在环原创 2016-09-27 23:32:36 · 682 阅读 · 0 评论 -
51nod1640 【最小生成树】
题意: 在一副图中,搞N-1条边,使得每个点都相连, 有多种可能的情况,所以求一种使得其中n-1条边的最大是所有可能的最小,然后并保证连接的n-1条边的权值总和最大 思路: 一开始没有看清题意,随便写了一发“最大生成树”连案例都跑不出,原来还有个条件是有n-1条边中的最大值是所有可能的最小。 然后窝就纳闷了。。。怎么搞法搞到一条最大的最小,随便搞了个最小生成树,写着写着发现其实最小生成树里原创 2016-09-27 23:42:46 · 597 阅读 · 0 评论 -
POJ1466/HDOJ1068 谈谈二分匹配的时间复杂度
题意: n个学生编号是0-n-1,然后给出他们这些人和一些人的关系。 要你找出最大的人数,要求这些人之间没关系。 咳咳,题目中没说性别的关系TVT 思路: 很明显是一个匹配算法,但是我们得搞出一个二分图; 将每个点拆成两个点,一个当作是男的点,一个当作是女的点,匹配一遍,由于关系是相互的,这样就造成了边的重复。也就是边集是刚才的二倍,从而导致了最大匹配变成了二倍。 所以我们要算的 最大原创 2016-05-18 15:04:52 · 645 阅读 · 0 评论 -
POJ1236【图的强连通(缩点)】
题意: 1.初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。 2.至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。 思路: 我们先把图中的强连通分量缩点 经过缩点后,就可以把强连通分量看成一个个独立的点,这张图可以模拟一下,有离散的点,有一些连起来的点,咳咳,但绝对不是连通的! 题目的问题1那不就是在新原创 2016-05-15 10:59:34 · 465 阅读 · 0 评论 -
HDU1598【最小生成树拓展】
参考自 http://www.cnblogs.com/nanke/archive/2012/02/13/2350008.htmlPS:没想到最小生成树的kruskal算法从小到大枚举边,然后MAX-MIN就保证了最小。不过居然没想到这个方案,就是二分枚举差值,然后跑最短路;原创 2016-10-08 00:05:29 · 325 阅读 · 0 评论 -
POJ 2186【Tarjan算法(模板_缩点)】
//在一张有向无环图G,图G会包含很多环(环里面的点是等价的),//当然可以把环缩成一个点(利用tarjan缩点),//形成一棵树,题目要求是求除他以外的点都指向他,也就是只有一个叶子。//因为一旦有两个,那么两个叶子没有联系,也就不满足除他以外所有点指向了。//那么我们只要在缩点之后的图中,找出出度为0的点,然后输出它里面的点就可以了。#include<iostream>#include原创 2016-05-15 10:13:25 · 2266 阅读 · 0 评论 -
跳马~~~HDU1372
基础BFS,水过就好~手写队列优化~~#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <algorithm>us原创 2016-07-05 19:44:09 · 437 阅读 · 0 评论 -
PTA 2-1 列出连通集【DFS+BFS基础】
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数N(0#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>原创 2016-07-05 18:10:27 · 707 阅读 · 0 评论 -
poj2421【MST-prim+Kruskal】
prim水过~打好基础~~~#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <algorithm>using n原创 2016-07-04 11:28:58 · 563 阅读 · 0 评论 -
hdu2767(图的强连通)
//题意:问需要添加几条边使得这张图成为每个点都等价(强连通图)我们先把图中的强连通分量缩点 可能他本身就是满足条件,那么直接输出0 经过缩点后,就可以把强连通分量看成一个个独立的点,在这张图上搞一个强连通图,我们可以根据强连通的性质,也就是每个点都要有被指向边和出去的边,那么也就是求一下每个点(强连通分量)的入度和出度,把出度==0的点个数加起来,把入度==0的点个数加起来,比一比谁大,输出谁原创 2016-05-15 10:40:25 · 688 阅读 · 0 评论 -
hdoj1495简单BFS
#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>#include <iostream>using namespace std;#define LL __int64#define mod 9973#define N 100010int n,m,s;bool vis[102][110][1原创 2016-05-27 19:12:55 · 437 阅读 · 0 评论 -
POJ2446【建图建图】
题意: 给你一个n*n的矩阵,然后再给你几个坑,然后问你能否被1*2的长方形给覆盖;-弱知道了是二分匹配的做法,但是弱还是不会转化,又是在建图上GG了分析: 从国际象棋的那个黑白色理解,这是一张二分图(好像非常有道理)建图:由于是1*2的纸片覆盖,那么这个区域的两个点的(i+j)必然是一个奇数和一个偶数。 先搞好点,我们分别给奇数、偶数点 依次从1开始标号,相邻的就是有一条边; 这波建原创 2016-05-16 23:17:43 · 518 阅读 · 0 评论 -
纯拓扑排序一搞poj2367
/* author: keyboarder time : 2016-05-18 12:21:26 */ #include<cstdio>#include<string.h>#include<iostream>#define N 110int pre[N];int ma[N][N];bool vis[N];int n;void tuopu(){ int cnt=0;原创 2016-05-18 12:26:25 · 590 阅读 · 0 评论 -
HDU 2063 过山车+poj 1469
//这是一个非常简单的匹配。其实满感觉这种算法讲道理是可以想到。 //但是我们这种弱就只能先学了匈牙利算法,然后随便嗨这种题目了。没事结果都一样。//这就是匹配算法的DFS形式,有一个BFS形式的,说是适用于稀疏二分图,但是时间复杂度还是(n*m)。。。 //也不是很懂DFS和BFS版有什么差,但是真的有差别,那就上HK算法了,时间复杂度(sqrt(n)*m); #include <iostre原创 2016-05-16 18:21:10 · 479 阅读 · 0 评论 -
poj2239 poj1274【二分匹配】
题意: 就是尽可能的选多的课思路: 把课程和上课的时间看作二分图 跑一跑二分匹配就好了#include<iostream>#include<cstdio>#include<string.h>#include<algorithm>using namespace std;#define INF 0x3f3f3f3f#define N 350int cos[10][20];原创 2016-05-19 16:59:35 · 518 阅读 · 0 评论 -
二分匹配ZOJ3646
//题意:类比线代里:把矩阵中的U看作【1】,是否满足一个满秩矩阵 //利用二分匹配就是 //每一行都有相对应的列; #include<iostream>#include<string.h>#include<set>#include<queue>#include<sstream>using namespace std;#define N 220char s[N][N];int m原创 2016-05-20 14:09:23 · 546 阅读 · 0 评论 -
hdoj1528【二分匹配】
题意: 在一幅扑克牌里,有两个人在比大小,第二个人最多能赢第一个人几张牌。 思路: 这道题目用一下二分匹配还是很明显的。 那么就是建图似乎要麻烦一下,但还是很方便的。将扑克牌一次进行编号,然后牌面比他小的就有一条边。这是一张大的图,两个人的手牌还是要标记一下,因为我们只对取到的牌操作。然后就是在这个范围内跑一跑二分匹配就好了。还是满基础的建图+二分匹配,我都1A了…code:#include原创 2016-06-02 22:34:31 · 556 阅读 · 0 评论 -
hdoj1728【搜索的两种写法】
以前的一道题目,现在拿到总觉得是DFS,然后T掉就没什么想法了,很狗的看了以前的写法(以前还是看题解的AC的),是BFS,每次都要转弯,但是之前你的达到一种他走到了死路,所以才是不得不转弯,写法也是非常棒,预处理的转弯数是-1就可以达到一开始转弯的+1抵消。但是总觉得还是有dfs,毕竟k这么小。先贴一发BFS的,睡觉了~#include<iostream>#include<cstdio>#inc原创 2016-07-09 00:59:12 · 920 阅读 · 0 评论 -
HDOJ4857【拓扑排序】
首先 CLJ ORZ 这道题做了两次,第一次瞎搞。。。 第二次,好吧,骄傲地说水过。。。 题意:不说了; 思路: 题目默认是小的在前面,那么就是反向建图,每次排序拿大的出来;第一次做的时候,我记得我的思路是:还是正向建图,然后每次拿小的出来,天真啊,年轻啊,一个例子:1->3->4和5->2,很明显最终的排序,应该是1,5,2,3,4,其实一开始我还看过题解不理解为什么会这样,我还是理解成原创 2016-05-20 17:16:57 · 534 阅读 · 0 评论 -
hdoj1116【欧拉回路】
题意: 应该是求一个路径让所有的单词能够首尾连起来,不需要头和尾的单词也连起来。。。应该很容易懂吧。。。我这里讲的好烂。。 思路: 从欧拉回路的定义引申过来。 1. 连通。 2. 入度和出度问题。问题就是怎么建图??? N(1e5)条边啊。那肯定是邻接表建图。 具体处理呢?对于一个单词,肯定是考虑首尾,单词都是小写字母(lowercase characters),所以首尾的单词肯定原创 2016-07-14 11:36:09 · 460 阅读 · 0 评论 -
= =写个prim希望能够巨巨们看的懂
prim算法——-典型的贪心算法 求最小生成树的算法 (Minimum Spanning Tree)最小生成树:算法思想:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合U中找到另一点c使得点c到V中任意一点的权值最小,此时将c点加入集合V,直原创 2016-07-04 10:23:57 · 441 阅读 · 0 评论 -
POJ1861 kruskal.
#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <algorithm>using namespace std;原创 2016-07-04 11:06:49 · 469 阅读 · 0 评论 -
最大流建图习题
Lightoj 1154题意: 二维坐标上有N(<=100)个点, 每个点有两个值,一个值是在这个点上的企鹅数量,另一个值是能从这个点跳到另一个点的最大数量,一个点能跳的点的距离<=D, 现在让你求存在哪些点可以使得所有企鹅集合。 思路: 利用D值可以对所有点之间建边,容量就是能跳的最大数量。 具体建图呢?比如u有多个点a,b,c可以到达,肯定不可能是u和a,b,c都连一条边然后容量设置成限原创 2017-11-23 13:36:37 · 1036 阅读 · 0 评论