7-6 Friendly Group
题目
Sample Input
2
4 5
1 2
1 3
1 4
2 3
3 4
2 1
1 2
Sample Output
Case #1: 1
Case #2: 0
分析
把他们之间的好朋友关系对应到图上,两个人是好朋友的话,他们之间连一条边,显然环是要满足的最低要求,在一个环中,点和边个数一样,对答案的贡献是0,如果不是环,那么点的个数大于边数,那么对答案的贡献是负的。
最后总结做法就是要对这个无向图强联通分量缩点,记下每个强联通分量中的点的个数和边的个数,把所有对答案有正贡献的分量相加。
缩点可以看这个【模板】缩点(Tarjan缩点,拓扑序上dp)
code
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
using ll = long long;
const int N = 300000 + 10, M = 1000000 + 10;
int n, m;
vector<int> G[N];
int deg[N]; // 每个点连的边数
int dfn[N], low[N], times; // dfn时间戳
int sta[N], sz; // 手写栈,tarjan时点入栈
bool insta[N]; // 标记是否在栈中
int tot; // 强连通分量总个数
int sum_e[N]; // 每个分量的边总数
int sum_p[N]; // 每个分量的点总数
void tarjan(int u) {
dfn[u] = low[u] = ++times;
sta[++sz] = u;
insta[u] = true;
for (int v : G[u]) {
if (!dfn[v])