![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
2016专题训练3(最短路、最小生成树、强连通分量)
文章平均质量分 60
金金金金鑫
这个作者很懒,什么都没留下…
展开
-
HDU 1548 A strange lift
题意:给你n思路:每层你能选择向上或者向下,而且每层最多到达一次(因为到达多次能产生的结果和到达一次能产生的结果是一样的)。所以理所当然地选择BFS。#include#include#includeusing namespace std;const int MAX=205;int n,a,b,k[MAX];bool vis[MAX];struct Node{ i原创 2016-07-23 19:30:24 · 155 阅读 · 0 评论 -
POJ 2553 The Bottom of a Graph
题意:定义一个点所能到达的所有点都能到达这个点,那么该点就是一个sink点,现给你n个点m条边的有向图,问你图中有多少个sink点,并指出对应的点。思路:首先明白一点,强连通分量里的所有点都是相互可达的,里面的点和分量外面的点都是只有一方可达的,所有我们只要用Tarjan缩点,然后对于出度为0的强连通分量,里面的所有点就是我们所求的点。#include#include#incl原创 2016-07-23 20:32:43 · 200 阅读 · 0 评论 -
HDU 1827 Summer Holiday
题意:你需要打电话通知n个人,通知第i个人会花a[i]的钱,但是可以叫他去通知其他能通知的人,先给你m个关系表示a能通知b,但b不一定能通知a。问你最少需要通知多少个人和最少需要花费多少钱才能使全部人都知道。思路:一开始以为是简单地找入度为0的点,但是样例就过不了了(这个样例特别良心)。因为存在1->2,2->1的强连通分量,如果没人能通知他们,那么他们就不会被通知到。所以我们就需要用原创 2016-07-23 20:14:38 · 196 阅读 · 0 评论 -
HDU 2767 Proving Equivalences
题意:给你n条声明和m条启示,每条启示表示声明a能推出声明b,但是b不一定能推出a,问你最小需要添加多少条启示才能任选两条启示都能互相推导出来。思路:说白了就是给你n个点m条边的无向图,问你要添加多少条边才能使其成为一个强连通分量。先用Tarjan缩点,然后去算每个点的出度和入度,然后计算入度为0的个数num1和出度为0的个数num2,答案就是max(num1,num2)。原因很简单,原创 2016-07-23 20:01:35 · 303 阅读 · 0 评论 -
HDU 1811 Rank of Tetris
题意:给出n个人(编号为0~n-1)m种信息"A > B","A = B","A 思路:把所有相等的当成一个人来看,因为相等的内部肯定可以按编号大小来排。然后进行拓扑排序,只存在一个入度为0的点且能完成拓扑的才输出OK。其他的若不能完成拓扑输出CONFLICT(包括有多个入度为0),若能完成拓扑,但有多个入度为0的输出UNCERTAIN。#include#include#i原创 2016-07-23 19:40:10 · 235 阅读 · 0 评论 -
HDU 2066 一个人的旅行
题意:有T条路,S个起点,E个终点,选择一个起点到达某个终点使其路径最小。思路:多个起点问题很自然想到建立个超级原点0#include#include#include#include#define INF 0x3f3f3f3f#define MAXN 1005#define MAXM 1000005using namespace std;struct Node{原创 2016-07-23 19:37:13 · 151 阅读 · 0 评论 -
HDU 1598 find the most comfortable road
题意:给你n思路:先将边从小到大排,然后枚举每一条边作为起始边,然后去枚举比它大的边,用并查集不断维护这个图,直到s和e都加入后比较ans和(最后一条加入的边-起始边)。#include#includeusing namespace std;const int INF=0x3f3f3f3f;const int MAXN=205;const int MAXM=1005;原创 2016-07-23 19:17:36 · 187 阅读 · 0 评论 -
HDU 1535 Invitation Cards
题意:给你n思路:从城市1到其他城市的最短路很好求,那从其他城市返回城市1的最短路呢?很简单,只需把每条有向边反向来建图再跑一遍最短路就可以。#include#include#include#define INF 0x3f3f3f3f#define MAX 1000005using namespace std;typedef __int64 LL;struct No原创 2016-07-23 19:54:16 · 181 阅读 · 0 评论 -
POJ 1258 Agri-Net
题意:给你n个点n*n条边,要你求最小生成树。思路:最小生成树Kruskal算法。#include#includeusing namespace std;const int MAX=105;int n,cnt,fa[MAX];struct Edge{ int u,v,w;}edge[MAX*MAX];bool cmp(Edge a,Edge b){ re原创 2016-07-23 19:50:41 · 145 阅读 · 0 评论 -
HDU 1863 畅通工程
题意:给你n个点m条边,要你求最小生成树,若不能构成树输出-1。思路:最小生成树Kruskal算法。#include#includeusing namespace std;const int MAX=1005;int n,m,fa[MAX];struct Edge{ int u,v,w;}edge[MAX];bool cmp(Edge a,Edge b){原创 2016-07-23 19:48:55 · 273 阅读 · 0 评论 -
POJ 2762 Going from u to v or from v to u?
题意:给你n思路:注意这里只要有一条路径存在即可,那么明显强连通分量里的任意两点都是可达的,所以可以用Tarjan把强连通分量缩成一点,然后判断该图是否任意两点之间存在一条路径,其实就是判断是否为一条单向的直链就行。#include#include#include#include#include#includeusing namespace std;const in原创 2016-07-23 20:26:51 · 227 阅读 · 0 评论