提交时间:2022-08-09 11:34:54

运行 ID: 55140

#include <bits/stdc++.h> using namespace std; template<typename T> inline void red(T &x) { bool s=1;x=0;char c=getchar(); while(c<=32) c=getchar(); if(c=='-') s=-1,c=getchar(); for(; ('0'<=c && c<='9'); c=getchar()) x=(x<<3)+(x<<1)+(c^48); x=(s==1?x:-x); } struct node { int u,t; //边权皆为1 }; const int maxn=1e5+10; int n,m,u,v,t,maxflow=INT_MIN,ans,ss[maxn],flag=1; //贪心 //从下往上 //不可能的情况:连接汇点和源点间路径有唯一 vector<node>ed[maxn]; int main() { red(n),red(m); for(int i=1; i<=m; i++) red(u),red(v),red(t),ed[v].push_back({u,t}); set<int,greater<int> >s; deque<int>q; q.push_back(n); while(!q.empty()) { int x=q.front(); if(x==1) { flag=0; break; } q.pop_front(); for(int i=0; i<ed[x].size(); i++) { if(ed[x][i].u==1) flag=0; if(s.find(ed[x][i].u)!=s.end()) s.erase(ed[x][i].u),q.push_back(ed[n][i].u); else s.insert(ed[x][i].u); } for(set<int>::iterator ii=s.begin(); ii!=s.end(); ii++) ss[(*ii)]=1; s.clear(); } if(flag) { puts("-1"); for(int i=1; i<=n; i++) cout<<ss[i]; } else { int ans=0; for(int i=1; i<=n; i++) ans+=ss[i]; cout<<n-ans<<endl; for(int i=1; i<=n; i++) cout<<(ss[i]^1); } return 0; }