![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
tsunaa
这个作者很懒,什么都没留下…
展开
-
HDU - 3926 Hand in Hand(并查集+同构图判断)
Hand in HandHDU - 3926因为一个点只能连两条边,所以要么成环,要么成链。判断两次形成的图是否同构图。同构图是什么把图的边想象成可以自由活动的绳子,在绳子任意变动期间的图形都是同构图。典型例子是五边形和五角星。如何判断同构图思路之一:通过并查集确定环数/链数,和环内/链内的人数,再排序进行比较。我的代码#include<bits/stdc++.h>using namespace std;const int maxn = 10005;int t, n1,原创 2021-05-24 19:21:43 · 388 阅读 · 1 评论 -
HDU-3231 Box Relations(三维拓扑排序)
Box RelationsHDU-3231构造题有n个长方体,满足以下要求:I i, \j : i, j不相交X i, j : i的x维度上的坐标都小于j的x维度上的坐标Y,Z 同理对每一维分别进行拓扑排序。注意:1、对每一维,对于长方体i,都天然满足xi1 < xi2, yi1 < yi2,zi1 < zi2。2、对与I i, j:i, j 不相交,即两个长方体中,某一个长方体的右面一定大于另一个长方体的左面,这样有两条语句:xi1 < xj2, xi2 &原创 2021-05-23 16:41:44 · 136 阅读 · 0 评论 -
HDU 1811 Rank of Tetris (拓扑排序+并查集)
Rank of TetrisHDU 1811对于“=”,用并查集,把它们看成一个点。对于“>”,“<”,用拓扑排序。1、先用并查集把相同的点合并成一个集合。2、再建图。3、拓扑排序:CONFLICT: 给出的关系不能得到完整排名,即不能得到拓扑排序,即有向图有环,入度为0的个数cnt<n.UNCERTAIN:给出的关系能得到一部分排名,即能得到拓扑排序,入度为0的个数cnt = n,但中途入度 为0的不止一个点。判断方法:队列中只有一个数(队列中保存入度为0的点)。OK:原创 2021-05-20 15:46:56 · 128 阅读 · 0 评论 -
HDU - 2647 Reward (简单拓扑排序+反向建图)
Reward HDU - 2647我的代码#include<bits/stdc++.h>using namespace std;const int maxn = 10005;int n, m;vector<int>e[maxn];int in[maxn], add[maxn];void topsort(){ priority_queue<int , vector<int>, greater<int> > s;//原创 2021-05-16 17:04:33 · 193 阅读 · 0 评论 -
HDU - 2094 产生冠军 (拓扑排序)
产生冠军HDU - 2094拓扑排序。冠军只有一个,即要求入度为1的人只有一个。选择我的代码#include<bits/stdc++.h>using namespace std;const int maxn = 505;int n, m;map<string, int>in, vis;string name[maxn];int main(){ string x, y; while(cin >> n){ if(n ==原创 2021-05-16 16:07:02 · 179 阅读 · 0 评论 -
HDU 1285 确定比赛名次(拓扑排序)
确定比赛名次HDU 1285模板题,按字典序输出拓扑排序,用到优先队列我的代码#include<bits/stdc++.h>using namespace std;const int maxn = 505;int n, m;int in[maxn], path[maxn];vector <int> e[maxn];void topsort(){ priority_queue<int , vector<int>, greater<i原创 2021-05-16 15:28:03 · 119 阅读 · 0 评论 -
HDU 1863 畅通工程(最小生成树)
畅通工程HDU 1863 模板题要判断是否存在最小生成树,即边数要>n-1我的代码用kruskal算法,如果有n-1条边如何条件,输出mst,否则输出 ?//kruskal#include<bits/stdc++.h>using namespace std;const int maxn = 1005;int f[maxn];int n, m, a, b, cnt, mst;struct node{ int u, v, w;}e[maxn];bool原创 2021-05-15 16:36:21 · 181 阅读 · 0 评论 -
HDU 1233 还是畅通工程(最小生成树)
还是畅通工程(最小生成树)HDU 1233模板题,稠密图,用Prim算法//稠密图, prim#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3fconst int maxn = 105;int e[maxn][maxn], vis[maxn], dis[maxn];int n, u, v, w, mst;void prim(){ for(int i = 1; i <= n; i++原创 2021-05-15 16:03:06 · 158 阅读 · 0 评论 -
HDU 1232 畅通工程(并查集)
畅通工程HDU - 1232 模板题问至少还有多少条边才能形成一个连通图。连通图:n个点,n-1条边我的代码#include<bits/stdc++.h>using namespace std;const int maxn = 1005;int f[maxn];int n, m, a, b, cnt;int Find(int x){ if(x == f[x]) return x; else return f[x] = Find(f[x]);}int原创 2021-05-15 15:51:54 · 124 阅读 · 0 评论 -
HDU - 1856 More is better (并查集)
HDU - 1856 More is better (并查集)HDU - 1856 即找元素最多的集合。设置一个siz[i]数组,表示当前根为 i 的集合元素个数。在Union函数中每次两个集合合并时更新siz[i]。我的代码#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 10000005;int a, b;int f[maxn], siz[maxn];int a原创 2021-05-13 16:44:17 · 193 阅读 · 0 评论 -
HDU - 1272 小希的迷宫(并查集)
并查集应用——小希的迷宫HDU - 1272 方法一:对于输入的a、b,先判断是否在同一集合(即fa == fb),如果在,则不符合。最后要判断:是否只有一个连通图。我的代码#include<bits/stdc++.h>using namespace std;#define ll long longconst ll maxn = 1e5 + 5;ll f[maxn], vis[maxn];ll a, b, res;int findFather(int x){ i原创 2021-05-13 16:47:47 · 150 阅读 · 0 评论 -
HDU - 1325 Is It A Tree?(并查集)
Is It A Tree? HDU 1325方法一与“小希的迷宫”不同的是,这里多了个入度的概念(树的概念,只有一个入度为0的根)。参考样例: 1 2 1 3 2 4 2 5 3 6 7 3 0 0所以变动:把判断输入的两个a, b是否在同一集合,变成统计被指向的结点的入度的个数:in[b]++其他不变。最后要判断:1、是否连通图2、是否入度为0的点只有一个我的代码#include<bits/stdc++.h>using namespace std;#define l原创 2021-05-13 16:51:44 · 113 阅读 · 0 评论 -
HDU - 1102 Constructing Roads(最小生成树)
Constructing Roads (最小生成树)HDU - 1102 模板题我的代码prim算法有几条路事先修好了,那么把修好路的两个点看成同一个点,即两点间距离为0即可。#include<bits/stdc++.h>using namespace std;const int maxn = 105;#define inf 0x3f3f3f3fint n, a, b, x, q;int e[maxn][maxn], vis[maxn], dis[maxn];int ms原创 2021-05-15 15:15:25 · 128 阅读 · 0 评论