제출 #258074

#제출 시각아이디문제언어결과실행 시간메모리
258074MrRobot_28Skandi (COCI20_skandi)C++17
110 / 110
1674 ms18036 KiB
#include<bits/stdc++.h>
using namespace std;
vector <vector <int> > g;
vector <int> mt, used;
vector <vector <int> > g1;
vector <bool> used1;
bool dfs(int v, int cnt)
{
	if(used[v] == cnt)
	{
		return false;
	}
	used[v] = cnt;
	for(int i = 0; i < g[v].size(); i++)
	{
		if(mt[g[v][i]] == -1 || dfs(mt[g[v][i]], cnt))
		{
			mt[g[v][i]] = v;
			return true;
		}
	}
	return false;
}
void dfs1(int v)
{
	used1[v] = 1;
	for(int i = 0; i < g1[v].size(); i++)
	{
		int to = g1[v][i];
		if(!used1[to])
		{
			dfs1(to);
		}
	}
}
signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n, m;
	cin >> n >> m;
	vector <vector <char> > A(n, vector <char> (m));
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			cin >> A[i][j];
		}
	}
	int cnt = 0;
	int cnt1 = 0;
	vector <vector <int> > num1(n, vector <int> (m)), num2(n, vector <int> (m));
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++)
		{
			if(A[i][j] == '0')
			{
				if(A[i][j - 1] == '1')
				{
					num1[i][j] = cnt;
					cnt1++;
					cnt++;
				}
				else
				{
					num1[i][j] = num1[i][j - 1];
				}
			}
		}
	}
	for(int j = 0; j < m; j++)
	{
		for(int i = 0; i < n; i++)
		{
			if(A[i][j] == '0')
			{
				if(A[i - 1][j] == '1')
				{
					num2[i][j] = cnt;
					cnt++;
				}
				else
				{
					num2[i][j] = num2[i - 1][j];
				}
			}
		}
	}
	g.resize(cnt);
	mt.resize(cnt, -1);
	used.resize(cnt);
	g1.resize(cnt);
	used1.resize(cnt);
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			if(A[i][j] == '0')
			{
				int a = num1[i][j];
				int b = num2[i][j];
				g[a].push_back(b);
				g[b].push_back(a);
			}
		}
	}
	for(int i = 0; i < cnt1; i++)
	{
		dfs(i, i + 1);
	}
	vector <bool> used2(cnt);
	for(int i = cnt1; i < cnt; i++){
		for(int j = 0; j < g[i].size(); j++)
		{
			if(g[i][j] == mt[i])
			{
				used2[mt[i]] = 1;
				g1[i].push_back(mt[i]);
			}
			else
			{
				g1[g[i][j]].push_back(i);
			}
		}
	}
	for(int i = 0; i < cnt1; i++)
	{
		if(!used2[i])
		{
			dfs1(i);
		}
	}
	vector <pair <int, int> > mass1, mass2;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			if(A[i][j] == '0' && A[i][j - 1] == '1')
			{
				if(!used1[num1[i][j]])
				{
					mass1.push_back({i + 1, j});
				}
			}
			if(A[i][j] == '0' && A[i - 1][j] == '1')
			{
				if(used1[num2[i][j]])
				{
					mass2.push_back({i, j + 1});
				}
			}
		}
	}
	cout << mass1.size() + mass2.size() << "\n";
	for(int i = 0; i < mass1.size(); i++)
	{
		cout << mass1[i].first << " " << mass1[i].second << " " << "DESNO\n";
	}
	for(int i = 0; i < mass2.size(); i++)
	{
		cout << mass2[i].first << " " << mass2[i].second << " " << "DOLJE\n";
	}
  	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

skandi.cpp: In function 'bool dfs(int, int)':
skandi.cpp:14:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[v].size(); i++)
                 ~~^~~~~~~~~~~~~
skandi.cpp: In function 'void dfs1(int)':
skandi.cpp:27:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g1[v].size(); i++)
                 ~~^~~~~~~~~~~~~~
skandi.cpp: In function 'int main()':
skandi.cpp:113:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j = 0; j < g[i].size(); j++)
                  ~~^~~~~~~~~~~~~
skandi.cpp:155:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < mass1.size(); i++)
                 ~~^~~~~~~~~~~~~~
skandi.cpp:159:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < mass2.size(); i++)
                 ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...