why TLE+WA+RE
查看原帖
why TLE+WA+RE
906320
Milky_Cat楼主2024/7/31 20:27
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, s, t, cnt, mxf, ans;
int h[20005], zd[50005], ed[50005], nxt[50005], vis[20005], inc[20005], pr[20005], vvis[20005];
int qwq[20005];
queue<int> q;
vector<int> qu, qv;
bool uv[10005][10005];
pair<int, int> aans[20005];
void add(int u, int v, int c){
	zd[++cnt] = v, ed[cnt] = c, nxt[cnt] = h[u], h[u] = cnt;
	zd[++cnt] = u, nxt[cnt] = h[v], h[v] = cnt;
}
void dfs(int u){
    if (vvis[u])
        return;
    vvis[u] = 1;
    for (int p = h[u]; p; p = nxt[p]){
    	int v = zd[p]; 
        qwq[v] = qwq[u] ^ 1;
		dfs(v);
	}
}
bool bfs(){
	memset(vis, 0, sizeof vis);
	while (!q.empty())
		q.pop();
	q.push(s);
	vis[s] = 1;
	inc[s] = LLONG_MAX;
	while (!q.empty()){
		int u = q.front();
		q.pop();
		for (int i = h[u]; i; i = nxt[i])
			if (ed[i]){
				int v = zd[i];
				if (vis[v])
					continue;
				inc[v] = min(inc[u], ed[i]);
				pr[v] = i;
				q.push(v);
				vis[v] = 1;
				if (v == t)
					return 1;
			}
	}
	return 0;
}
int dfn[20005], low[20005], col[20005];
stack<int> ss;
void tarjan(int u){
	dfn[u] = low[u] = ++cnt;
	ss.push(u);
	vis[u] = 1;
	for (int i = h[u]; i; i = nxt[i]){
		int v = zd[i];
		if (ed[i] <= 0)
			continue;
	//	cerr << "qwq" << u << " " << v << " " << dfn[v] << "\n";
		if (!dfn[v]){
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}else if (vis[v])
			low[u] = min(low[u], dfn[v]);
	}
	if (dfn[u] == low[u]){
		while (!ss.empty()){
			int v = ss.top();
			ss.pop();
			vis[v] = 0;
			col[v] = u;
			if (u == v)
				break;
		}
	}
}
void upd(){
	int u = t;
	while(u != s){
		int i = pr[u];
		ed[i] -= inc[t];
		ed[i ^ 1] += inc[t];
		u = zd[i ^ 1];
	}
	mxf += inc[t];
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n >> m;
	s = 0;
	t = n + 1;
	cnt = 1;
//	for (int i = 1; i <= n; i++){
//		add(s, i, 1);
//		add(i, t, 1);
//	}
	for (int i = 1; i <= m; i++){
		int u, v;
		cin >> u >> v;
		qu.push_back(u);
		qv.push_back(v);
		uv[u][v] = 1;
		add(u, v, 1);
	}
	for (int i = 1; i <= n; i++)
        if (!vvis[i]){
        	qwq[i] = 0;
        	dfs(i);
		}
	for (int i = 1; i <= n; i++){
		if (!qwq[i])
			add(s, i, 1);
		else
			add(i, t, 1);
	}
//	for (int u = 0; u <= n + 1; u++)
//		for (int p = h[u]; p; p = nxt[p])
//			cout << u << " " << zd[p] << " " << ed[p] << "\n";
	while(bfs())
		upd(); 
	memset(vis, 0, sizeof vis);
	cnt = 0;
	for (int i = 0; i <= n; i++)
		if (!dfn[i])
			tarjan(i);
//	for (int i = 1; i <= n; i++)
//		cout << col[i] << " ";
//	cout << "\n";
//	for (int i = 0; i <= n; i++)
//		if (!dfn[i])
//			tarjan(i);
//	for (int i = 1; i <= n; i++)
//		cout << col[i] << " ";
//	cout << "\n";
//	for (int u = 0; u <= n + 1; u++)
//		for (int p = h[u]; p; p = nxt[p])
//			cout << u << " " << zd[p] << " " << ed[p] << "\n";
	for (int u = 0; u <= n + 1; u++)
		for (int p = h[u]; p; p = nxt[p])
			if (!ed[p] && uv[u][zd[p]] && col[u] != col[zd[p]]){
				++ans;
				aans[ans].first = min(u, zd[p]);
				aans[ans].second = max(u, zd[p]);
			}
	cout << ans << "\n";
	sort(aans + 1, aans + 1 + ans);
	for (int i = 1; i <= ans; i++)
		cout << aans[i].first << " " << aans[i].second << "\n";
	return 0;
}
2024/7/31 20:27
加载中...