关于编译器奇怪的输出
  • 板块学术版
  • 楼主lxzy_
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/6/30 13:13
  • 上次更新2023/11/6 23:52:50
查看原帖
关于编译器奇怪的输出
67493
lxzy_楼主2020/6/30 13:13

之前写了一道最小生成树的题,以下是我的代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+50;
struct edge{
    int f;
    int t;
    int val[N];
}g[N];
bool vis[N];
int mine[N];
int ans[N];
int fa[N];
int cnt;
int n,m,k,d;
bool cmp(edge a,edge b)
{
    return a.val[cnt]>b.val[cnt];
}

int Find(int x)
{
    if(x==fa[x]) return x;
    return Find(fa[x]);
}

bool Merge(int x,int y)
{
    int X=Find(x);
    int Y=Find(y);
    if(X==Y) return false;
    fa[X]=Y;
    return true;
}

int main()
{
    scanf("%d%d%d%d",&n,&m,&k,&d);
    int u,v,w;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        g[i].f=u;
        g[i].t=v;
        for(int j=1;j<=d;j++)
        {
            scanf("%d",&w);
            g[i].val[j]=w;
        }
    }
    memset(ans,0x7f,sizeof(ans));
    for(int i=1;i<=n;i++) fa[i]=i;
    int tt=0;
    int pos=0;
    bool q=false;
    for(int k=1;k<=d;k++)
    {
        cnt++;
        pos=0;
        sort(g+1,g+1+m,cmp);
        q=!q;
        for(int i=1;i<=m;i++)
        {
            if(vis[i]==q) continue;
            vis[i]=q;
            if(Merge(g[i].f,g[i].t))
            {
                tt++;
                mine[++pos]=i;
            }
            if(tt==n-1) break;
        }

    }
    
    for(int i=1;i<=pos;i++)
    {
        for(int j=1;j<=d;j++)
        {
            ans[i]=min(ans[i],g[mine[j]].val[i]);
        }
        printf("%d ",ans[i]);
    }
    return 0;
}

但是编译器却给出了:

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

2020/6/30 13:13
加载中...