||___图论___||
CaprYang
这个作者很懒,什么都没留下…
展开
-
Cow Contest POJ - 3660 Floyd
题解按照题意所要求的能确定的情况下 其它所有人都要与这个人有联系(能间接性确定他比其它人要强或者没其它人强) 否则无法确定用Floyd求出每个点是否能到达其它点(比它强) 对行和列求和判断是否大于等于N-1(有时候能到达自身而有时不行)附dalao样例5 41 32 33 43 5结果为1AC代码#include <stdio.h>#include <i...原创 2018-11-22 00:05:48 · 358 阅读 · 0 评论 -
Codeforces Round #541 (Div. 2) D. Gourmet choice 并查集 拓扑排序
题解题目大意,一个人第一天吃了n份食物第二天吃了m份食物,给你一个n*m的矩阵表示第一天的某份食物和第二天的某份食物哪个更好吃或一样好吃,要求你对每个食物进行打分满足所给矩阵。首先使用并查集将一样好吃的情况缩为一个点进行处理,如果a>b则b<—a建一条单向边,如果a<b则a—>b建一条单向边。初始入度为0的点评分设置为1,使用拓扑排序将当前点指向的点评分对当前点评分+...原创 2019-02-25 17:46:11 · 403 阅读 · 0 评论 -
有向无环图 CSU - 1804 拓扑排序 dp
题解由于是有向无环图,可以使用拓扑排序+dp求解,令f[i]表示通过不同路径到达i节点的a的和。拓扑排序不断的从入度为0的节点处理,如当前节点为i目标节点为j,每次f[j] += a[i] + f[i]。a[i]表示i到j,由于是不同路径所以每条边都加。f[i]表示之前能到达i而i又能到达j所以之前能到达i的都能到达j,也是每条边都加。最后将每个节点的f[i]和b[i]相乘求和即可。AC...原创 2019-04-04 19:55:26 · 530 阅读 · 0 评论 -
Wormholes POJ - 3259 SPFA
题解题目的意思就是问一个带负边的图是否有负环,使用SPFA求解。如果某个节点第n次入队则说明当前图有负环输出YES。AC代码#include <stdio.h>#include <iostream>#include <string.h>#include <queue>#define fst first#define sed secon...原创 2019-04-05 01:16:31 · 227 阅读 · 0 评论 -
牛客练习赛43 C Tachibana Kanade Loves Review kruskal 卡常
题解使用kruskal求解,创建一个虚拟点0方便处理。将每个点本身的权值作为和虚拟点连接的边权,k个已习得的点和虚拟点建立0权边。普通关系就把两个点建立对应代价的边。由于数据输入量较大使用fread快读,并查集使用路径压缩+启发式合并优化。AC代码#include <stdio.h>#include <bits/stdc++.h>#define fst fir...原创 2019-04-06 11:53:37 · 360 阅读 · 0 评论 -
L2-030 冰岛人 LCA 暴力
题解首先说明一下题意,有些题面没说明白。如果A是C的第5代,B是C的第4代则不满足,要求最近公共祖先是两个人的5代及以上。如果查询的是起源人也是输出NA。给出的名称最后表示性别的m和f不算为名称后缀,查询时会带有。题目实际上就是给定一个图,问两个点是否有5代以内的最近公共祖先。由于给的是字符串,需要先用map编号为1~n的点处理。映射编号建图后,从祖先节点0开始DFS求出每个点的深度。找L...原创 2019-04-02 19:14:28 · 1468 阅读 · 1 评论 -
L2-013 红色警报 并查集 逆向
题解题目要求在当前城市被攻陷之后,有些城市会导致无法连通时发出红色警报。逆向思考,可以将删除操作改为添加。如果添加当前点并且添加当前点连接的原有边后,导致原来两个不联通的部分连在一起则这个时候就是红色警报。这个连接操作并且检测是否有两个不同的联通分量合并在一起,可以使用并查集压缩路径O(1)完成。标记删除的点,逆向添加每个点,注意连接边时需要注意判断当前点是否存在。可以先和一个已存在的点...原创 2019-04-03 00:09:59 · 635 阅读 · 0 评论 -
地铁 CSU - 1808 dijkstra 拆点
题解每个点有多个线路,不同线路之间切换需要额外代价,直接在队列的节点中记录当前线路编号增加额外代价无法得到最优解。将原有节点拆分,使用map进行标号,如果当前节点有x个线路相连则将当前节点拆分为x个点,原边只在相同线路的点副本之间连接。**每个节点,相邻站点编号的副本节点进行相连,代价为编号差。**不用每个副本都两两之间建立边,会导致极端复杂度M^2。起始节点和终点的副本之间建立0代价边。...原创 2019-04-09 21:02:36 · 688 阅读 · 0 评论 -
河南省第九届ACM程序设计竞赛 部分题解
A 表达式求值 <逆波兰>#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const ll LINF =...原创 2019-04-21 14:14:21 · 1179 阅读 · 0 评论 -
河南省第十一届ACM大学生程序设计竞赛 部分题解
题目链接A 计划日#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const ll LINF = 0x3f3f3f3f3f3f3f3f;bool leapyear(int y){ ...原创 2019-04-18 19:50:48 · 949 阅读 · 0 评论 -
Flow Problem HDU - 3549 最大流
题解模板题。。dinic求最大流。AC代码#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const ll LI...原创 2019-04-18 22:34:43 · 491 阅读 · 0 评论 -
C 小A与欧拉路 牛客练习赛40 树的直径
题解首先考虑欧拉回路的情况,由于所给的图是一棵树则如果想构成欧拉回路就需要将每条边都复制一份。但是题目没要求回到出发点,则可以只从一个点出发到另一个点结束,所走路径也就是少了从出发点到终止点的路径。这个路径可以自己选择,则选择所给树形图中权值长度最大的两个点收益最大,也就是树的直径。树的直径使用两次DFS可以得到。AC代码#include <stdio.h>#includ...原创 2019-02-18 20:44:18 · 477 阅读 · 0 评论 -
Educational Codeforces Round 49 (Rated for Div. 2) D. Mouse Hunt tarjan | 拓扑排序
题解题目大意 有一些房间 每个房间布置老鼠夹需要一定代价 一个房间只能单向到达另一个房间 老鼠最开始可能出现在任何房间 问无论如何都能抓到老鼠的最小代价按照题意 如果在一个环上则只需要在环内选取一个最小代价的点,如果在一个链上则只需要选取链的终点(终点可以为环)tarjan:使用tarjan算法求出有向图的强连通分量,并缩为一个点代价为强连通分量内最小代价,最后只需要对缩点后出度为0的点求...原创 2019-02-12 20:11:58 · 489 阅读 · 0 评论 -
Strongly connected HDU - 4635 tarjan
题解题目大意 给一个简单有向图,问最多能添加多少条边保证图仍是简单图且不是强连通图,如果本身就是强连通输出-1每个强连通分量作为一个整体看待,所以使用tarjan将每个强连通分量缩为一个点,考虑这些点选择一个点使得其他点只能到达这个点或者只能从这个点到达其它点(也就是单向联通)如果这个点选在某个链的非端点位置则需要满足这个条件会让很多点都同时满足这个条件,这样得到的答案肯定不是最优所以要选...原创 2019-02-12 20:00:03 · 598 阅读 · 0 评论 -
确定比赛名次 HDU - 1285 拓扑排序
标题问题本质就是输出入度为0的节点然后删边继续拓扑排序模版题 使用优先队列解决多种情况下输出最小编号的问题AC代码#include <stdio.h>#include <bits\stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int M...原创 2018-11-22 00:09:01 · 369 阅读 · 0 评论 -
一个人的旅行 HDU - 2066 dijkstra
题解使用dijkstra算法+堆优化 处理时将所有起点加入队列并设置起点代价为0 跑完最短路在所有终点中选代价最小的一个注意为无向图AC代码#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f...原创 2018-12-23 20:55:04 · 290 阅读 · 0 评论 -
Arctic Network POJ - 2349 Kruskal
题解根据题意 需要将所有点联通 但是有M个卫星通信装置 所以可以省去M-1条边先使用Kruskal跑最小生成树 再减去M-1条较大边剩下的取最大为答案AC代码#include &lt;stdio.h&gt;#include &lt;iostream&gt;#include &lt;vector&gt;#include &lt;algorithm&gt;原创 2018-12-23 21:05:39 · 612 阅读 · 0 评论 -
comet OJ 热身赛 E. dijkstra dijkstra
题解利用距离公式建边跑dijkstra两条线距离c1-c2/sqrt(aa+bb) 线与圆利用点到直线距离-圆半径与0取max 圆到圆直接点距离公式-半径与0取maxAC代码#include &lt;stdio.h&gt;#include &lt;bits/stdc++.h&gt;using namespace std;typedef long long ll;const int...原创 2019-01-19 15:37:33 · 598 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day1 (Div2, onsite) F 爬爬爬山 dijkstra
题解根据题意 当wls下降一定高度再回到原始高度之后体力值也会回复为原有值可以将题意简化为如果想要登上高度大于h[1]+k高度的山时要将山缩减为h[1]+k的高度按照这个规律建图 将无向边拆分为两条 通往高度大于h[1]+k的山的边代价增加与h[1]+k的高度差和0取max后平方建图完毕后直接跑dijkstra加堆优化即可AC代码#include &amp;lt;stdio.h&amp;gt;#in...原创 2019-01-20 18:08:24 · 498 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day4 (Div2, onsite) C 最小边覆盖
题解按照题意尽量的使用最少的边把每个点至少覆盖一次 则如果有一条边两段度数都大于1则这条边可以删去所以只需要检测输入的边两端点度数是否大于1即可AC代码#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f...原创 2019-01-28 23:25:41 · 145 阅读 · 0 评论 -
Two Paths HDU - 6181 A* K短路
题解题目大意,给定一个无向图,求1到n的次短路,保证1到n有路径,起点终点相同时需要再次回到起点。使用dijkstra以终点为初始点跑出其它所有节点到终点的最短路径作为A*的h函数值。以起点为起始点使用A*算法,当第二次到达终点时则为次短路。AC代码#include <stdio.h>#include <bits/stdc++.h>#define fst fi...原创 2019-02-27 18:51:24 · 554 阅读 · 0 评论 -
ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven A* K短路
题解题目大意,给一个有向图,问起点到终点的k短路代价是否小于t。使用A算法求解,由于是有向图使用dijkstra得到其它所有点到终点的最短路时需要建立反向边。给定的有向图不一定能从起点到达终点,**在使用A之前先判断是否可达,否则会造成死循环。**AC代码#include &lt;stdio.h&gt;#include &lt;bits/stdc++.h&gt;#define fst...原创 2019-02-27 19:09:01 · 220 阅读 · 0 评论 -
迷宫城堡 HDU - 1269 tarjan
题解题目的就是问所给的图是不是强连通图,有向图找强连通可以使用tarjan算法求出强连通分量个数,如果为1则输出YesAC代码#include <stdio.h>#include <bits/stdc++.h>#define fs first#define sc secondusing namespace std;typedef long long ll;...原创 2019-02-12 19:45:37 · 387 阅读 · 0 评论 -
Farm Tour POJ - 2135 费用流
题解要求从起点到终点在回到起点,可以看做起点到终点流量为2的网络流。题目所给出的边没有方向设置为两条容量为1的有向边。限制流大小为2,最后跑最小费用最大流即可。AC代码#include <stdio.h>#include <iostream>#include <algorithm>#include <queue>#include &l...原创 2019-04-18 22:40:11 · 942 阅读 · 3 评论