本地185ms左右,洛谷却TLE
查看原帖
本地185ms左右,洛谷却TLE
1216590
BrokenVessle楼主2024/4/20 12:46

RT

#include<iostream>
#include<queue>
#include<cstring>
//#include<ctime>
using namespace std;
struct Edge { int end, next, cap, flow; }e[400000];
int head[405], cnt;
void addedge(int u, int v, int f) { e[cnt] = { v,head[u],f,0 }, head[u] = cnt++; }
int n;
int dis[405];
bool BFS(int s, int t)
{
	for (int i = 1;i <= n * 2 + 2;++i)dis[i] = 0;
	queue<int>q;
	q.push(s);
	dis[s] = 1;
	while (!q.empty())
	{
		int u = q.front();
		q.pop();
		for (int i = head[u];~i;i = e[i].next)
		{
			if (!dis[e[i].end] && e[i].cap > e[i].flow)
			{
				dis[e[i].end] = dis[u] + 1;
				q.push(e[i].end);
			}
		}
	}
	return dis[t];
}
int cur[205];
int DFS(int s, int t, int flow)
{
	if (s == t || !flow)return flow;
	int ret = 0, d;
	for (int& i = cur[s];~i;i = e[i].next)
	{
		if (dis[e[i].end] == dis[s] + 1 && (d = DFS(e[i].end, t, min(e[i].cap - e[i].flow, flow - ret))))
		{
			ret += d;
			e[i].flow += d;
			e[i ^ 1].flow -= d;
			if (ret == flow)return ret;
		}
	}
	return ret;
}
int Dinic()
{
	int ans = 0;
	while (BFS(2 * n + 1, 2 * n + 2))
	{
		for (int i = 1;i <= 2 * n + 2;++i)cur[i] = head[i];
		ans += DFS(2 * n + 1, 2 * n + 2, 0x3f3f3f3f);
	}
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	//clock_t cl = clock();
	//freopen("P1129_7.in", "r", stdin);
	//freopen("alpha.out", "w", stdout);
	memset(head, -1, sizeof head);
	int t;
	cin >> t;
	while (t--)
	{
		for (int i = 1;i <= n * 2 + 2;++i)head[i] = -1;
		cin >> n;
		cnt = 0;
		for (int i = 1;i <= n;++i)
		{
			addedge(2 * n + 1, i, 1);
			addedge(i, 2 * n + 1, 0);
			addedge(i + n, 2 * n + 2, 1);
			addedge(2 * n + 2, i + n, 0);
		}
		for (int i = 1, a;i <= n;++i)
			for (int j = n + 1;j <= n + n;++j)
			{
				cin >> a;
				if (a)
				{
					addedge(i, j, 1);
					addedge(j, i, 0);
				}
			}
		if (Dinic() == n)cout << "Yes\n";
		else cout << "No\n";
	}
	//cout << clock() - cl;
	return 0;
}
2024/4/20 12:46
加载中...