整理的算法模板合集: ACM模板
题单链接:一个动态更新的洛谷综合题单
Part 8.1 图的存储与遍历
这里的图论内容都比较简单,涉及图的存储以及遍历图的方式。
求最小环
- 权值为1:并查集
- 权值不定:最短路(Dijkstra / Floyd)
求环的大小
- tarjan缩点
P2661 信息传递(最小环)
-
我们把每个人视作一个点,并向他的信息传递对象连一条有向边构成一个有向图。每个人都有且仅有一个信息传递对象,同时这个信息传递对象不能是自己。那么这个有向图一定存在一个环。
-
信息从自己出发又回到自己,必然是传递的路径形成了一个环。当有人得知自己得信息时就结束,说明要在这个图中寻找一个最小的环。
寻找最小环可以使用dijkstra或者floyd算法解决。
本题的权值只有1,并且每个点只有一个出度,所以我们可以用并查集解决。
由于我们所有的点入度不定,出度只有1,所以如果找到该点一个环,那么这个环上的这个点到其父节点的这条边是不可能会再被遍历的,所以我们不用连上这条边。如果我们连上的话,就会死循环。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
const int N = 500010;
int read()
{
int x = 0, f = -1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){
x = x * 10 + ch - '0';ch = getchar();}
return x * f;
}
int fa[N];
int n, m;
int Find(int x, int &res)
{
res ++ ;
//cout << cnt << endl;