Submission #1411763


Source Code Expand

#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define SIZE 500
#define INF 1000000
typedef pair<int, int>pii;
class maxflow
{
public:
	vector<int>pat[SIZE];
	vector<int>cap[SIZE];
	vector<int>rev[SIZE];
	bool flag[SIZE];
	int dist[SIZE];
	int now[SIZE], ind[SIZE];
	int idx[SIZE];
	int flow;
	int gd;
	void adde(int s, int t, int cp)//多重辺は消してから s->tの容量cpの辺をはる
	{
		pat[s].push_back(t);
		pat[t].push_back(s);
		cap[s].push_back(cp);
		cap[t].push_back(0);
		rev[s].push_back(pat[t].size() - 1);
		rev[t].push_back(pat[s].size() - 1);
	}
	void blockflow(int node, int len, int go, int pt)//ブロックフローを求めて流す
	{
		if (pt == len)
		{
			if (node != go)return;
			int mini = INF, rr = -1;
			for (int i = 0; i < pt; i++)if (cap[now[i]][ind[i]] < mini)mini = cap[now[i]][ind[i]], rr = i;
			for (int i = 0; i < pt; i++)cap[now[i]][ind[i]] -= mini, cap[pat[now[i]][ind[i]]][rev[now[i]][ind[i]]] += mini;
			flow += mini;//mini==INFになったら非有界
			gd = rr;
			return;
		}
		now[pt] = node;
		for (int i = idx[node]; i < pat[node].size(); i++)
		{
			if (dist[pat[node][i]] == dist[node] + 1 && cap[node][i]>0)
			{
				ind[pt] = i;
				blockflow(pat[node][i], len, go, pt + 1);
				if (gd < pt)break;
				else gd = INF;
			}
			idx[node]++;
		}
	}
	void dinic(int st, int go, int num)//dinicのアルゴリズムで最大流を求める 変数flowにmaxflowの値が入る
	{
		flow = 0;
		for (;;)
		{
			queue<pii>que;
			fill(dist, dist + num, INF);
			fill(flag, flag + num, false);
			que.push(make_pair(st, 0));
			for (;;)
			{
				if (que.empty())break;
				pii z = que.front();
				que.pop();
				if (flag[z.first])continue;
				flag[z.first] = true;
				dist[z.first] = z.second;
				for (int i = 0; i < pat[z.first].size(); i++)
				{
					if (dist[pat[z.first][i]]>z.second + 1 && cap[z.first][i] > 0)
					{
						dist[pat[z.first][i]] = z.second + 1;
						que.push(make_pair(pat[z.first][i], z.second + 1));
					}
				}
			}
			if (dist[go] == INF)return;
			gd = INF;
			fill(idx, idx + SIZE, 0);
			blockflow(st, dist[go], go, 0);
		}
	}
	vector<int>getcut(int st, int go, int num)//頂点iがmincutのst側なら1 そうでなければ0
	{
		dinic(st, go, num);
		vector<int>ret;
		for (int i = 0; i < num; i++)ret.push_back(flag[i]);
		return ret;
	}
};
maxflow fl;
class unionfind
{
public:
	int par[SIZE];
	int ran[SIZE];
	int ren[SIZE];
	void init()
	{
		for (int i = 0; i<SIZE; i++)
		{
			par[i] = i;
			ran[i] = 0;
			ren[i] = 1;
		}
	}
	int find(int a)
	{
		if (a == par[a])return a;
		else return par[a] = find(par[a]);
	}
	void unite(int a, int b)
	{
		a = find(a);
		b = find(b);
		if (a == b)return;
		if (ran[a]>ran[b])
		{
			par[b] = a;
			ren[a] += ren[b];
		}
		else
		{
			par[a] = b;
			ren[b] += ren[a];
		}
		if (ran[a] == ran[b])ran[b]++;
	}
};
unionfind uf;
int odeg[500], ideg[500];
bool flag[500];
void no()
{
	printf("NO\n");
	exit(0);
}
int main()
{
	int num, hei;
	scanf("%d%d", &num, &hei);
	uf.init();
	for (int i = 0; i < num; i++)
	{
		int za, zb, zc, zd;
		scanf("%d%d%d%d", &za, &zb, &zc, &zd);
		int s, t;
		if (zc == 0)s = za * 2;
		else s = zc * 2 + 1;
		if (zd == 0)t = zb * 2 + 1;
		else t = zd * 2;
		fl.adde(s, t, 1);
		uf.unite(s, t);
		odeg[s]++, ideg[t]++;
	}
	int sum = 0;
	for (int i = 1; i <= hei; i++)
	{
		if (odeg[i * 2] < ideg[i * 2])no();
		else if (odeg[i * 2] > ideg[i * 2])fl.adde(0, i * 2, odeg[i * 2] - ideg[i * 2]), sum += odeg[i * 2] - ideg[i * 2], flag[uf.find(i * 2)] = true;
		if (odeg[i * 2 + 1]>ideg[i * 2 + 1])no();
		else if (odeg[i * 2 + 1] < ideg[i * 2 + 1])fl.adde(i * 2 + 1, 1, ideg[i * 2 + 1] - odeg[i * 2 + 1]);
	}
	for (int i = 2; i <= hei * 2 + 1; i++)
	{
		if (i == uf.find(i))
		{
			if ((!flag[i]) && ideg[i] > 0)no();
		}
	}
	fl.dinic(0, 1, hei * 2 + 2);
	if (sum != fl.flow)no();
	printf("YES\n");
}

Submission Info

Submission Time
Task E - Jigsaw
User DEGwer
Language C++14 (GCC 5.4.1)
Score 1200
Code Size 4081 Byte
Status AC
Exec Time 41 ms
Memory 4608 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:145:27: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &num, &hei);
                           ^
./Main.cpp:150:40: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d%d", &za, &zb, &zc, &zd);
                                        ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1200 / 1200
Status
AC × 3
AC × 84
Set Name Test Cases
Sample sample1.txt, sample2.txt, sample3.txt
All sample1.txt, sample2.txt, sample3.txt, a1.txt, a2.txt, a3.txt, b1.txt, b10.txt, b101.txt, b102.txt, b103.txt, b104.txt, b105.txt, b106.txt, b107.txt, b108.txt, b109.txt, b11.txt, b110.txt, b111.txt, b112.txt, b113.txt, b114.txt, b115.txt, b116.txt, b117.txt, b118.txt, b119.txt, b12.txt, b13.txt, b14.txt, b15.txt, b2.txt, b200.txt, b201.txt, b202.txt, b203.txt, b204.txt, b205.txt, b206.txt, b207.txt, b208.txt, b209.txt, b210.txt, b211.txt, b212.txt, b213.txt, b214.txt, b215.txt, b216.txt, b217.txt, b218.txt, b219.txt, b3.txt, b300.txt, b301.txt, b302.txt, b303.txt, b304.txt, b305.txt, b306.txt, b307.txt, b308.txt, b309.txt, b310.txt, b311.txt, b4.txt, b5.txt, b6.txt, b7.txt, b8.txt, b9.txt, c1.txt, c2.txt, c3.txt, c4.txt, c5.txt, d1.txt, d2.txt, d3.txt, d4.txt, sample1.txt, sample2.txt, sample3.txt
Case Name Status Exec Time Memory
a1.txt AC 1 ms 256 KB
a2.txt AC 5 ms 640 KB
a3.txt AC 34 ms 3840 KB
b1.txt AC 1 ms 256 KB
b10.txt AC 8 ms 1024 KB
b101.txt AC 36 ms 3968 KB
b102.txt AC 35 ms 4096 KB
b103.txt AC 36 ms 3840 KB
b104.txt AC 36 ms 4096 KB
b105.txt AC 35 ms 3968 KB
b106.txt AC 16 ms 1664 KB
b107.txt AC 32 ms 3456 KB
b108.txt AC 36 ms 3968 KB
b109.txt AC 31 ms 3584 KB
b11.txt AC 24 ms 2944 KB
b110.txt AC 36 ms 4096 KB
b111.txt AC 35 ms 4352 KB
b112.txt AC 36 ms 3968 KB
b113.txt AC 36 ms 4096 KB
b114.txt AC 35 ms 3968 KB
b115.txt AC 16 ms 1792 KB
b116.txt AC 32 ms 2944 KB
b117.txt AC 35 ms 3968 KB
b118.txt AC 27 ms 3072 KB
b119.txt AC 31 ms 3328 KB
b12.txt AC 24 ms 2560 KB
b13.txt AC 36 ms 3968 KB
b14.txt AC 37 ms 4096 KB
b15.txt AC 36 ms 3968 KB
b2.txt AC 5 ms 640 KB
b200.txt AC 34 ms 3840 KB
b201.txt AC 34 ms 3840 KB
b202.txt AC 35 ms 3840 KB
b203.txt AC 34 ms 3840 KB
b204.txt AC 36 ms 3968 KB
b205.txt AC 37 ms 4096 KB
b206.txt AC 35 ms 4224 KB
b207.txt AC 34 ms 4224 KB
b208.txt AC 38 ms 4224 KB
b209.txt AC 34 ms 4096 KB
b210.txt AC 34 ms 3840 KB
b211.txt AC 36 ms 3840 KB
b212.txt AC 34 ms 3840 KB
b213.txt AC 36 ms 3840 KB
b214.txt AC 37 ms 3968 KB
b215.txt AC 34 ms 4096 KB
b216.txt AC 37 ms 4224 KB
b217.txt AC 37 ms 4224 KB
b218.txt AC 35 ms 4224 KB
b219.txt AC 38 ms 4096 KB
b3.txt AC 35 ms 4608 KB
b300.txt AC 41 ms 3712 KB
b301.txt AC 33 ms 3712 KB
b302.txt AC 26 ms 2544 KB
b303.txt AC 26 ms 2672 KB
b304.txt AC 40 ms 3712 KB
b305.txt AC 33 ms 3712 KB
b306.txt AC 23 ms 2796 KB
b307.txt AC 26 ms 2672 KB
b308.txt AC 35 ms 3712 KB
b309.txt AC 41 ms 3712 KB
b310.txt AC 33 ms 3560 KB
b311.txt AC 34 ms 3440 KB
b4.txt AC 36 ms 4480 KB
b5.txt AC 5 ms 640 KB
b6.txt AC 5 ms 640 KB
b7.txt AC 5 ms 640 KB
b8.txt AC 5 ms 640 KB
b9.txt AC 5 ms 640 KB
c1.txt AC 28 ms 3436 KB
c2.txt AC 28 ms 3116 KB
c3.txt AC 26 ms 2464 KB
c4.txt AC 28 ms 3564 KB
c5.txt AC 17 ms 2036 KB
d1.txt AC 35 ms 3968 KB
d2.txt AC 35 ms 3840 KB
d3.txt AC 35 ms 3712 KB
d4.txt AC 28 ms 3072 KB
sample1.txt AC 1 ms 256 KB
sample2.txt AC 1 ms 256 KB
sample3.txt AC 1 ms 256 KB