做个记录,如果有人愿意帮我调蒟蒻将感激不尽qwq
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <bitset>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cassert>
#define x first
#define y second
#define pb push_back
#define eb emplace_back
#define pf push_front
#define desktop "C:\\Users\\incra\\Desktop\\"
#define IOS ios :: sync_with_stdio (false),cin.tie (0),cout.tie (0)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair <int,int> PII;
const int dx[] = {1,0,-1,0},dy[] = {0,-1,0,1};
template <typename T1,typename T2> bool tomax (T1 &x,T2 y) {
if (y > x) return x = y,true;
return false;
}
template <typename T1,typename T2> bool tomin (T1 &x,T2 y) {
if (y < x) return x = y,true;
return false;
}
LL power (LL a,LL b,LL p) {
LL ans = 1;
while (b) {
if (b & 1) ans = ans * a % p;
a = a * a % p;
b >>= 1;
}
return ans;
}
int fastio = (IOS,0);
#define puts(s) cout << s << endl
const int N = 100010,M = 200010;
int n,m;
vector <int> g[N];
int dfn[N],low[N],timestamp;
int stk[N],top;
vector <int> dcc[N];
int dcc_cnt;
int ans1,ans2;
bool st[N];
void get (int x) {
memset (st,false,sizeof (st));
for (int y : dcc[x]) st[y] = true;
int ecnt = 0;
for (int u : dcc[x]) {
for (int v : g[u]) {
if (st[v]) ecnt++;
}
}
ecnt /= 2;
if (ecnt > dcc[x].size ()) ans2 += ecnt;
}
void tarjan (int u,int fa) {
dfn[u] = low[u] = ++timestamp;
stk[++top] = u;
for (int v : g[u]) {
if (v == fa) continue;
if (!dfn[v]) {
tarjan (v,u);
tomin (low[u],low[v]);
if (low[v] >= dfn[u]) {
if (low[v] > dfn[u]) ans1++;
dcc_cnt++;
dcc[dcc_cnt].pb (u);
while (stk[top + 1] != v) dcc[dcc_cnt].pb (stk[top--]);
get (dcc_cnt);
}
}
else tomin (low[u],dfn[v]);
}
}
int main () {
while (cin >> n >> m,n) {
for (int i = 1;i <= n;i++) g[i].clear (),dcc[i].clear ();
memset (dfn,0,sizeof (dfn));
top = dcc_cnt = timestamp = 0;
while (m--) {
int a,b;
cin >> a >> b;
a++,b++;
g[a].pb (b),g[b].pb (a);
}
ans1 = 0,ans2 = 0;
for (int i = 1;i <= n;i++) {
if (!dfn[i]) tarjan (i,-1);
}
cout << ans1 << ' ' << ans2 << endl;
}
return 0;
}
标签:HDU,求调,int,dcc,++,low,Railway,include,define
From: https://www.cnblogs.com/incra/p/18258543