-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathhonest.cpp
75 lines (73 loc) · 1.66 KB
/
honest.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# include <cstdio>
# include <vector>
# include <cstring>
using namespace std;
struct elem
{
int y;
short val;
}E;
vector <elem> v[1005];
int i,j,n,m,x,y,var,nrsol,ok,V,luate;
int ap[1005],ord[1005],sol[1005];
char ch;
void DFS (int k)
{
ap[k]=1;
for (int i=0; i<v[k].size(); ++i)
if (!ap[v[k][i].y]) DFS(v[k][i].y);
ord[--var]=k;
}
int main ()
{
freopen ("honest.in", "r", stdin);
freopen ("honest.out", "w", stdout);
scanf ("%d%d", &n, &m);
for (i=1; i<=m; ++i)
{
scanf ("%d %c%d", &x, &ch, &y);
E.y=y;
if (ch=='m') E.val=-1;
else E.val=1;
v[x].push_back(E);
}
var=n+1;
for (i=1; i<=n; ++i)
if (!ap[i]) DFS (i);
sol[1]=1; luate=1;
while (luate<n)
{
for (i=1; i<=n; ++i)
{
if (i==154)
{
i=i;
}
if (sol[i]==0)
{
for (j=0; j<v[i].size(); ++j)
if (sol[v[i][j].y]!=0) {
sol[i]=sol[v[i][j].y]*v[i][j].val;
++luate;
break;
}
}
if (sol[i]!=0)
{
for (j=0; j<v[i].size(); ++j)
if (sol[v[i][j].y]==0) sol[v[i][j].y]=sol[i]*v[i][j].val,++luate;
}
}
}
ok=1;
for (i=1; i<=n; ++i)
if (sol[i]==1) ++nrsol;
if (nrsol<n/2) ok=-1;
for (i=1; i<=n; ++i)
{
V=sol[i]*ok;
if (V==-1) V=0;
printf ("%d\n", V);
}
return 0;
}