Skip to content

Commit 60e81d5

Browse files
authoredFeb 7, 2018
graph, SCC
1 parent 6ce62c6 commit 60e81d5

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed
 

‎TopCoder/Autogame.cpp

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
//category : graph, SCC
2+
3+
#include <vector>
4+
#include <algorithm>
5+
#define ll long long
6+
using namespace std;
7+
const int mod = 1e9 + 7;
8+
class Autogame{
9+
public:
10+
vector<int> edge;
11+
vector<int> back[50];
12+
int K;
13+
int visit[50];
14+
int from[50];
15+
int back_dfs(int ix,int src,int sz,int depth,int *seat){
16+
ll res = 1;
17+
visit[ix] = 2;
18+
seat[sz-1+depth] = 1;
19+
for (int i = 0; i < back[ix].size(); i++){
20+
//if (visit[back[ix][i]] == 2) continue;
21+
res *= back_dfs(back[ix][i], src, sz, depth+1,seat);
22+
}
23+
if (depth > K) seat[sz-1 + depth - K]++;
24+
else seat[(src+K-depth)%sz]++;
25+
return res*seat[sz-1+depth]%mod;
26+
}
27+
int dfs(int ix){
28+
if (visit[ix]) return 1;
29+
visit[ix] = 1;
30+
ll res = 1;
31+
if (visit[edge[ix]] == 1){
32+
int stk = ix;
33+
vector<int> scc;
34+
scc.push_back(ix);
35+
visit[ix] = 2;
36+
while (stk != edge[ix]){
37+
stk = from[stk];
38+
visit[stk] = 2;
39+
scc.push_back(stk);
40+
}
41+
reverse(scc.begin(), scc.end());
42+
int seat[50] = { 0 };
43+
int i, j;
44+
for (i = 0; i < scc.size(); i++){
45+
for (j = 0; j < back[scc[i]].size(); j++){
46+
int to = back[scc[i]][j];
47+
if (visit[to] == 2) continue;
48+
res = res*back_dfs(to,i,scc.size(),1,seat);
49+
}
50+
seat[i]+=2;
51+
}
52+
for (i = 0; i < scc.size(); i++) res = res*seat[i] % mod;
53+
return res;
54+
}
55+
else{
56+
from[edge[ix]] = ix;
57+
return dfs(edge[ix]);
58+
}
59+
}
60+
int wayscnt(vector<int> a, int K){
61+
62+
int i;
63+
for (i = 0; i < a.size(); i++){
64+
visit[i] = 0;
65+
a[i]--;
66+
back[a[i]].push_back(i);
67+
}
68+
this->edge = a;
69+
this->K = K;
70+
ll res = 1;
71+
for (i = 0; i < a.size(); i++){
72+
//from[i] = -1;
73+
res = res*dfs(i) % mod;
74+
}
75+
76+
return res;
77+
}
78+
79+
};

0 commit comments

Comments
 (0)
Please sign in to comment.