kruskal+求割边
#include<iostream> #include<cstring> #include <cstdio> #include<string> #include<queue> #include<vector> #include<map> #include <set> #include<ctime> #include<cmath> #include <cstdlib> #include<algorithm> #include <iomanip> using namespace std; const int N=200010; const int INF=((1<<31)-1); int ans[N],q[N]; struct cutting_edge{ int cnt,scnt; int dfn[N],low[N],vis[N]; vector< pair<int,int> > G[N]; void init(int n){ for(int i=0;i<=n;i++){ G[i].clear(); vis[i]=0; } } void add(int u,int v,int id){ G[u].push_back(make_pair(v,id)); G[v].push_back(make_pair(u,id)); } void dfs(int u,int father){ dfn[u]=low[u]=++cnt; vis[u]=1; for(int i=0;i<G[u].size();i++){ int v=G[u][i].first; int id=G[u][i].second; if(vis[v]&&id!=father) low[u]=min(dfn[v],low[u]); else if(!vis[v]) { dfs(v,id); low[u]=min(low[u],low[v]); if(dfn[u]<low[v]) { scnt++; ans[id]=1; } } } } int tarjan(int *q,int tail){ cnt=0; scnt=0; for(int i=0;i<tail;i++) if(!vis[ q[i] ]) dfs( q[i],-1 ); return scnt; } }ce; struct node{ int u,v,w,id; }e[N]; struct ufind{ int f[N]; void init(int x) { for(int i=0;i<=x;i++) f[i]=i;} int find(int x) { return f[x]==x?x:f[x]=find(f[x]);} void set_friend(int i,int j){ f[find(i)]=find(j);} bool is_friend(int i,int j){ return find(i)==find(j) ? 1:0; } }uf; bool cmp(node a,node b){ return a.w<b.w; } void kruskal(int n,int m){ sort(e,e+m,cmp); uf.init(n); int pre=0; for(int i=0;i<=m;i++){ if(e[pre].w!=e[i].w){ int tail=0; for(int j=pre;j!=i;j++){ if(!uf.is_friend(e[j].u,e[j].v)){ ce.G[ uf.find(e[j].u) ].clear(); ce.G[ uf.find(e[j].v) ].clear(); ce.vis[ uf.find(e[j].u) ]=0; ce.vis[ uf.find(e[j].v) ]=0; q[tail++]=uf.find(e[j].u); q[tail++]=uf.find(e[j].v); ans[e[j].id]=2; } } for(int j=pre;j!=i;j++){ if(!uf.is_friend(e[j].u,e[j].v)){ ce.add(uf.find(e[j].u),uf.find(e[j].v),e[j].id); } } ce.tarjan(q,tail); for(int j=pre;j!=i;j++){ if(!uf.is_friend(e[j].u,e[j].v)){ uf.set_friend(e[j].u,e[j].v); } } pre=i; } } } int main(){ int n,m; scanf("%d%d",&n,&m); e[m].w=INF; for(int i=0;i<m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); e[i].u=u; e[i].v=v; e[i].w=w; e[i].id=i; ans[i]=0; } kruskal(n,m); for(int i=0;i<m;i++){ if(ans[i]==0) printf("none\n"); else if(ans[i]==1) printf("any\n"); else printf("at least one\n"); } }