这里有一个奇怪的编译器输出
  • 板块学术版
  • 楼主lxzy_
  • 当前回复10
  • 已保存回复10
  • 发布时间2020/8/19 20:05
  • 上次更新2023/11/6 19:54:32
查看原帖
这里有一个奇怪的编译器输出
67493
lxzy_楼主2020/8/19 20:05

这一份货车运输的代码:

#include<cstdio>
#include<iomanip>
#include<algorithm>
using namespace std;
const int N=1e5+50;
const int INF=0x7f7f7f7f; 
struct edge{
	int to;
	int val;
	int nxt;
}a[N];
struct side{
	int u;
	int v;
	int w;
}g[N];
int head[N];
int fa[N];
int f[N][30];
int mine[N][30];
int dep[N];
int cnt;
int nn,m;
int n;
int q;
int minex;
int miney;
bool vis[N];
int Min(int a,int b)
{
	if(a>b) return b;
	return a;
}
bool cmp(side a,side b)
{
	return a.w>b.w;
}
void add(int u,int v,int w)
{
	cnt++;
	a[cnt].to=v;
	a[cnt].val=w;
	a[cnt].nxt=head[u];
	head[u]=cnt;
}
int Find(int x)
{
	if(fa[x]==x) return x;
	return fa[x]=Find(fa[x]);
}
void Init()
{
	for(int i=1;i<=nn;i++) fa[i]=i;
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=20;j++) mine[i][j]=INF;
	}
}
bool Merge(int x,int y)
{
	int X=Find(x);
	int Y=Find(y);
	if(X==Y) return false;
	fa[X]=Y;
	return true;
}
bool Kruscal()
{
	int cnt=0;
	for(int i=1;i<=m;i++)
	{
		if(Merge(g[i].u,g[i].v))
		{
			add(g[i].u,g[i].v,g[i].w);
			add(g[i].v,g[i].u,g[i].w);
			cnt++;
		}
		if(cnt==n-1) return true;
	}
	return false;
}
void DFS(int u,int fa,int data)
{
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	mine[u][0]=data;
	for(int i=1;i<=20;i++)
	{
		f[u][i]=f[f[u][i-1]][i-1];
		mine[u][i]=min(mine[u][i-1],mine[f[u][i-1]][i-1]);
	}
	for(int i=head[u];i;i=a[i].nxt)
	{
		int v=a[i].to;
		if(v==fa) continue;
		DFS(v,u,a[i].val);
	}
}

void Find_LCA(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;i--)
	{
		if(dep[f[x][i]]>=dep[y]) minex=Min(minex,mine[x][i]),x=f[x][i];
		if(x==y) return ;
	}
	for(int i=20;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			minex=Min(minex,mine[x][i]);
			miney=Min(miney,mine[y][i]);
			x=f[x][i],y=f[y][i];
		}
	}
	minex=Min(minex,mine[x][0]);
	miney=Min(miney,mine[y][0]);
}

int main()
{
	scanf("%d%d",&nn,&m);
	int x,y,z;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		if(!vis[x]) n++,vis[x]=true;
		if(!vis[y]) n++,vis[y]=true;
		g[i].u=x,g[i].v=y,g[i].w=z;
	}
	sort(g+1,g+1+m,cmp);
	Init();
	if(!Kruscal())
	{
		printf("-1\n");
		return 0;
	}
	DFS(1,0,INF);
	scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		scanf("%d%d",&x,&y);
		minex=INF,miney=INF;
		if(!vis[x]||!vis[y])
		{
			printf("-1\n");
			continue;
		}
		Find_LCA(x,y);
		printf("%d\n",Min(minex,miney));
	}
	return 0;
}

引来了一些奇怪的编译错误:

请问各位大佬这是咋回事呢?

2020/8/19 20:05
加载中...