为什么这代码会TLE,爆蛋,本地测试与洛谷ide都对了
查看原帖
为什么这代码会TLE,爆蛋,本地测试与洛谷ide都对了
492716
expioi楼主2022/8/14 11:08
#include <bits/stdc++.h>

using namespace std;

int n1, n2, m, s, t, ans, d, cnt;

int head[1007], dis[1007], head2[1007];

struct Node
{
	int to, w, nxt;
}a[110007];

void add(int u, int v, int w = 0)
{
	a[++ cnt].to = v;
	a[cnt].w = w;
	a[cnt].nxt = head[u];
	head[u] = cnt;
}

bool bfs(int s)
{
	memset (dis, -1, sizeof dis);
	queue <int> q;
	q.push(s);
	dis[s] = 1;
	while (q.empty() == false)
	{
		int u = q.front();
		q.pop();
		for (int i = head[u]; i; i = a[i].nxt)
		{
			int v = a[i].to, w = a[i].w;
			if (dis[v] != -1 || !w)	
				continue;
			dis[v] = dis[u] + 1;
			q.push(v);
		}
	}
	return dis[t] != -1;
}

int dfs(int u, int flow)
{
	int sum = 0;
	if (u == t)
		return flow;
	for (int &i = head2[u]; i; i = a[i].nxt)
	{
		int v = a[i].to, w = a[i].w;
		if (!w || dis[u] + 1 != dis[v])
			continue;
//		cout << v << ' ' << w << ' ' << flow << ' ' << min(flow, w) << '\n';
		int minn = dfs (v, min (flow, w));
//		cout << minn << '\n';
		if (minn)
		{
			a[i].w -= minn;
			a[i ^ 1].w += minn;
			return minn; 
		}
	}
	return 0;
}

void dinic()
{
	while (bfs(s))
	{
		for (int i = 0; i <= t; ++ i)
//		{
			head2[i] = head[i];
//			cout << dis[i] << ' ';
//		}
//		puts("");
		while ((d = dfs (s, INT_MAX)) && d)
			ans += d;
//		getchar();
	}
}

int main ()
{
	cin >> n1 >> n2 >> m;
	t = n1 + n2 + 1;
	while (m --)
	{
		int u, v;
		cin >> u >> v;
		add(u, v + n1, 1);
		add(v + n1, u);
	}
	for (int i = 1; i <= n1; ++ i)
		add(s, i, 1), add(i, s);
	for (int i = 1; i <= n2; ++ i)
		add(t, i + n1), add(i + n1, t, 1);
	dinic();
	cout << ans;
	return 0;
}
2022/8/14 11:08
加载中...