!
\(bool f()\)
当\(f()\)必须要都执行时不能写成这样:
\(if( f(x) || f(y) )\) 因为当\(f(x) == true\)时\(f(y)\) 不会执行然后你就没了-_-
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+9;
int n,m;
int h[N],ver[N<<1],ne[N<<1],w[N<<1],id[N<<1],idx,preid[N];
int fa[N][23],mx[N][23],lg[N],dep[N],pa[N];
struct E
{
int u,v,w,id;
int col;
}e[N];
void add(int u,int v,int val,int i)
{
idx++,ver[idx] = v,ne[idx] = h[u],w[idx] = val,h[u] = idx,id[idx] = i;
}
bool cmp(E x,E y){return x.w < y.w;}
bool cmp1(E x,E y){return x.id < y.id;}
int get(int x)
{
if(pa[x] == x)return x;
return pa[x] = get(pa[x]);
}
void kul()
{
for(int i = 1;i <= n;i++)pa[i] = i;
int cnt = 0;
sort(e+1,e+1+m,cmp);
for(int i = 1;i <= m;i++)
{
int eu = get(e[i].u),ev = get(e[i].v);
if(eu == ev)continue;
pa[ev] = eu;
e[i].col = 1;
add(e[i].u,e[i].v,e[i].w,e[i].id);
add(e[i].v,e[i].u,e[i].w,e[i].id);
if(++cnt == n-1)break;
}
}
void dfs(int u,int pre,int p)
{
preid[u] = id[p];
dep[u] = dep[pre]+1,fa[u][0] = pre;
for(int i = 1;i <= lg[dep[u]]-1;i++)
fa[u][i] = fa[fa[u][i-1]][i-1],mx[u][i] = max(mx[u][i-1],mx[fa[u][i-1]][i-1]);
for(int i = h[u];i;i = ne[i])
{
int v = ver[i];
if(v == pre)continue;
mx[v][0] = w[i];
dfs(v,u,i);
}
}
int LCA(int x,int y)
{
if(dep[x] < dep[y])swap(x,y);
while(dep[x] > dep[y])x = fa[x][lg[dep[x]-dep[y]]-1];
if(x == y)return x;
for(int i = lg[dep[x]]-1;i >= 0;i--)
if(fa[x][i] != fa[y][i])x = fa[x][i],y = fa[y][i];
return fa[x][0];
}
void modify(int x,int i,int val)
{
if(i == 0)
{
e[preid[x]].col = 2;
return;
}
if(mx[x][i-1] == val)modify(x,i-1,val);
if(mx[fa[x][i-1]][i-1] == val)modify(fa[x][i-1],i-1,val);
}
bool find(int x,int lca,int val)
{
bool flag = 0;
for(int i = lg[dep[x]-dep[lca]]-1;i >= 0;i--)
{
if(dep[fa[x][i]] >= dep[lca])
{
if(mx[x][i] == val)flag = 1,modify(x,i,val);
x = fa[x][i];
}
}
return flag;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w),e[i].id = i,e[i].col = 0;
kul();
for(int i = 1;i <= n;i++)lg[i] = lg[i-1] + ((1<<lg[i-1]) == i);
dfs(1,0,0);
sort(e+1,e+1+m,cmp1);
for(int i = 1;i <= m;i++)
{
if(e[i].col)continue;
int u = e[i].u,v = e[i].v,val = e[i].w;
int lca = LCA(u,v);
//if(find(u,lca,val) || find(v,lca,val))e[i].col = 2; 不对 垃圾或符号
if(find(u,lca,val))e[i].col = 2;
if(find(v,lca,val))e[i].col = 2;
}
for(int i = 1;i <= m;i++)
{
if(e[i].col == 1)printf("any\n");
else if(e[i].col == 2)printf("at least one\n");
else printf("none\n");
}
return 0;
}