Pagini recente » Cod sursa (job #335182) | Cod sursa (job #2033480) | Cod sursa (job #2726726) | Cod sursa (job #283012) | Cod sursa (job #467445)
Cod sursa(job #467445)
#include<fstream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
const char iname[]="andrei.in";
const char oname[]="andrei.out";
const int maxn=200005;
ifstream f(iname);
ofstream g(oname);
int n,m,i,j,x,y,z;
vector<int> E[maxn];
int low_link[maxn],ind[maxn],indecs,ctc,s[maxn],value[maxn],grade[maxn];
queue<int> Q;
stack<int> S;
vector<int> CTC[maxn];
//good around here
void tarjan(int x)
{
low_link[x]=ind[x]=++indecs;
S.push(x);
for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
if(low_link[*it]==0)
tarjan(*it),low_link[x]=min(low_link[x],low_link[*it]);
else
if(ind[*it]>0)
low_link[x]=min(low_link[x],low_link[*it]);
if(ind[x]==low_link[x])
{
++ctc;
int node;
do
{
CTC[ctc].push_back(node=S.top());
ind[node]=-1;
S.pop();
s[node]=ctc;
}while(node!=x);
}
}//merge
int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y>>z;
if(z==0)
E[x].push_back(y+n),E[y].push_back(x+n);
else
if(z==1)
E[x+n].push_back(y),E[y+n].push_back(x);
else
E[x].push_back(y),E[y].push_back(x),
E[n+x].push_back(n+y),E[n+y].push_back(n+x);
}
for(i=1;i<=2*n;++i)
if(ind[i]==0)
tarjan(i);
for(i=1;i<=n;++i)
{
for(vector<int>::iterator it=E[i].begin();it!=E[i].end();++it)
if(s[i]!=s[*it])
++grade[s[*it]];
for(vector<int>::iterator it=E[n+i].begin();it!=E[n+i].end();++it)
if(s[n+i]!=s[*it])
++grade[s[*it]];
}
for(i=1;i<=ctc;++i)
if(grade[i]==0)
Q.push(i);//bun
for(i=1;i<=2*n;++i)
value[i]=-1;
while(!Q.empty())
{
x=Q.front();
Q.pop();
for(vector<int>::iterator it=CTC[x].begin();it!=CTC[x].end();++it)
for(vector<int>::iterator jt=E[*it].begin();jt!=E[*it].end();++jt)
if(s[*it]!=s[*jt])
{
--grade[s[*jt]];
if(grade[s[*jt]]==0)
Q.push(s[*jt]);
}
for(vector<int>::iterator it=CTC[x].begin();it!=CTC[x].end();++it)
if(value[*it]==-1)
{
if((*it)>n)
value[*it]=1,value[(*it)-n]=0;
else
value[*it]=1,value[(*it)+n]=0;
}
}//corect pana aici
for(i=1;i<=n;++i)
g<<value[i]<<" ";
g<<"\n";//crek bag citire parsata
}