关于||符号

\(bool f()\)

\(f()\)必须要都执行时不能写成这样:

\(if( f(x) || f(y) )\) 因为当\(f(x) == true\)\(f(y)\) 不会执行然后你就没了-_-

eg.最小生成树的边

#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;
}
posted @ 2022-10-21 09:44  AC7  阅读(157)  评论(0)    收藏  举报