Task: | New Shops |
Sender: | KnowYourArchitecture |
Submission time: | 2017-11-21 20:50:13 +0200 |
Language: | C++ |
Status: | READY |
Result: | WRONG ANSWER |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.04 s | details |
#2 | ACCEPTED | 0.04 s | details |
#3 | WRONG ANSWER | 0.05 s | details |
#4 | WRONG ANSWER | 0.05 s | details |
#5 | ACCEPTED | 0.04 s | details |
#6 | ACCEPTED | 0.11 s | details |
#7 | WRONG ANSWER | 0.03 s | details |
#8 | WRONG ANSWER | 0.05 s | details |
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: WRONG ANSWER
input |
---|
500 100 242 305 355 443 352 226 115 99 ... |
correct output |
---|
419 |
user output |
---|
409 |
Test 4
Verdict: WRONG ANSWER
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: WRONG ANSWER
input |
---|
500 400 1 2 2 3 3 4 3 5 ... |
correct output |
---|
200 |
user output |
---|
300 |
Test 8
Verdict: WRONG ANSWER
input |
---|
500 400 1 3 2 3 3 4 4 5 ... |
correct output |
---|
200 |
user output |
---|
100 |