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
| #include <cstdio> #include <algorithm> #include <cstring> #define F(n) Fi(i,n) #define Fi(i,n) Fl(i,0,n) #define Fl(i,l,n) for(int i=l;i<n;i++) #define N 100010 using namespace std; struct e{ int i,a,b,c; }E[4*N]; int F[N],dfs[N],low[N],EE[4*N],dfsn,ans; bool ANS[4*N],wed[4*N]; vector<int>G[N]; int find(int x){ return x==F[x]?x:F[x]=find(F[x]); } void Tarjan(int now){ dfs[now]=low[now]=++dfsn; for(int p:G[now])if(!wed[p]){ wed[p]=1; int t=EE[p]-now; if(dfs[t])low[now]=min(low[now],dfs[t]); else{ Tarjan(t); low[now]=min(low[now],low[t]); if(low[t]>dfs[now])ANS[p]=1,ans++; } } } int main(){ int n,m; scanf("%d%d",&n,&m); F(m)scanf("%d%d%d",&E[i].a,&E[i].b,&E[i].c),E[i].i=i; sort(E,E+m,[](const e&a,const e&b){return a.c<b.c;}); F(n)F[i+1]=i+1; F(m){ int k=E[i].c,p=i; while(p<m&&E[p].c==k){ int a=find(E[p].a),b=find(E[p].b); if(a==b){ wed[E[p++].i]=1; continue; } G[a].push_back(E[p].i); G[b].push_back(E[p].i); EE[E[p++].i]=a+b;
} Fl(j,i,p)if(!wed[E[j].i]) Tarjan(F[E[j].a]); Fl(j,i,p){ int a=F[E[j].a],b=F[E[j].b]; dfs[a]=dfs[b]=0; G[a].clear(); G[b].clear(); } Fl(j,i,p)F[find(E[j].a)]=find(E[j].b); i=p-1; } printf("%d\n",ans); if(ans){ F(m)if(ANS[i])printf("%d ",i+1); } else printf("0"); puts(""); scanf("%*d"); }
|