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
|
using namespace std; const int maxn = 1e5+10; int u[maxn],v[maxn],w[maxn]; int n,m; int deg[maxn],dfn[maxn]; vector<int> g[maxn]; vector<int> ans; bool (int x){ for(int i=1;i<=n;i++){ g[i].clear(); deg[i]=dfn[i]=0; } for(int i=1;i<=m;i++){ if(w[i]>x){ g[u[i]].push_back(v[i]); deg[v[i]]++; } } int df=0; queue<int> q; for(int i=1;i<=n;i++){ if(!deg[i]){ q.push(i);dfn[i]=++df; } } while(!q.empty()){ int now = q.front();q.pop(); for(auto to:g[now]){ if(dfn[to])return 0; deg[to]--; if(!deg[to]){ dfn[to]=++df; q.push(to); } } } if(df!=n)return 0; ans.clear(); for(int i=1;i<=m;i++){ if(dfn[u[i]]>dfn[v[i]]){ if(w[i]>x)return 0; ans.push_back(i); } } return 1; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d%d",u+i,v+i,w+i); } int l=-1,r=1e9+7; while(r-l>1){ int mid=l+r>>1; if(check(mid))r=mid; else l=mid; } check(r); cout<<r<<" "<<ans.size()<<endl; for(auto v:ans)cout<<v<<" "; return 0; }
|
近期评论