CSES - TCR Contest - Results
Submission details
Task:New Shops
Sender:KnowYourArchitecture
Submission time:2017-11-21 20:50:13 +0200
Language:C++
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.04 sdetails
#2ACCEPTED0.04 sdetails
#30.05 sdetails
#40.05 sdetails
#5ACCEPTED0.04 sdetails
#6ACCEPTED0.11 sdetails
#70.03 sdetails
#80.05 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:54:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int g=0;g<ret.size();g++) {
                         ^
input/code.cpp:74:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int g=0;g<ret.size();g++) {
                         ^

Code

#include <bits/stdc++.h>
using namespace std;

vector<int> v[501];
int incnt[501];
int group[501];
set<int> cv[501];
set<int> inc[501];

struct SCC {
	vector<int> used;
	vector<vector<int>> g2;
	void dfs1(vector<int>* g, int x, vector<int>& ns) {
		if(used[x]==1) return;
		used[x]=1;
		for(int nx:g[x]) {
			g2[nx].push_back(x);
			dfs1(g, nx, ns);
		}
		ns.push_back(x);
	}
	void dfs2(int x, vector<int>& co) {
		if(used[x]==2) return;
		used[x]=2;
		co.push_back(x);
		for(int nx:g2[x]) dfs2(nx, co);
	}
	SCC(vector<int>* g, int n, vector<vector<int>>& ret) : used(n+1), g2(n+1) {
		vector<int> ns;
		for(int i=1;i<=n;i++) dfs1(g, i, ns);
		for(int i=n-1;i>=0;i--) {
			if(used[ns[i]]!=2) {
				ret.push_back(vector<int>());
				dfs2(ns[i], ret.back());
			}
		}
	}
};

int selected[501];

int main() {
	int n, m;
	cin >> n >> m;
	vector<pair<int, int>> es;
	for(int i=0;i<m;i++) {
		int a, b;
		cin >> a >> b;
		v[a].push_back(b);
		es.push_back({a, b});
	}
	vector<vector<int>> ret;
	auto s = SCC(v, n, ret);
	for(int g=0;g<ret.size();g++) {
		auto comp = ret[g];
		for(auto i : comp) {
			group[i] = g;
		}
	}
	for(auto edge : es) {
		int a = edge.first;
		int b = edge.second;
		int ag = group[a];
		int bg = group[b];
		if(ag != bg) {
			incnt[bg]++;
			cv[ag].insert(bg);
			inc[bg].insert(ag);
		}
	}
	vector<int> q;
	vector<int> topo;
	int res = 0;
	for(int g=0;g<ret.size();g++) {
		int in = inc[g].size();
		int out = cv[g].size();
		if(in >= out) {
			bool can = true;
			for(auto p : inc[g]) {
				if(selected[p]) can=false;
			}
			if(can) res++;
			selected[g] = true;
		}
	}
	cout << res << endl;
	return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
500 1
26 290

correct output
499

user output
499

Test 2

Verdict: ACCEPTED

input
500 10
146 50
470 410
194 401
148 418
...

correct output
490

user output
490

Test 3

Verdict:

input
500 100
242 305
355 443
352 226
115 99
...

correct output
419

user output
409

Test 4

Verdict:

input
500 1000
149 65
352 26
174 351
422 495
...

correct output
70

user output
82

Test 5

Verdict: ACCEPTED

input
500 10000
110 165
276 195
49 78
269 104
...

correct output
1

user output
1

Test 6

Verdict: ACCEPTED

input
500 100000
383 273
369 206
250 310
424 67
...

correct output
1

user output
1

Test 7

Verdict:

input
500 400
1 2
2 3
3 4
3 5
...

correct output
200

user output
300

Test 8

Verdict:

input
500 400
1 3
2 3
3 4
4 5
...

correct output
200

user output
100