86分求助!
查看原帖
86分求助!
397712
dingyibo楼主2023/3/18 12:25
#include <bits/stdc++.h>

using namespace std;

#define MAX_N 100001
#define MAX_M 500001

int n, m, k;

struct Edge
{
    int u, v, w;
};
Edge e[MAX_M];
int cnt;
void AddEdge( int u, int v, int w )
{
    e[cnt].u = u;
    e[cnt].v = v;
    e[cnt++].w = w;
}

int fa[MAX_N];

void Init( )
{
    int i;

    for(i=0;i<=n;++i)
        fa[i] = -1;

    return ;
}
int Find( int x )
{
    return fa[x] < 0 ? x : fa[x] = Find( fa[x] );
}
void Union( int u, int v )
{
    if(fa[u] > fa[v])
    {
        fa[v] += fa[u];
        fa[u] = v;
    }
    else
    {
        fa[u] += fa[v];
        fa[v] = u;
    }
}

bool Cmp( const Edge &a, const Edge &b )
{
    return a.w < b.w;
}

long long edge_cnt;
int ind[MAX_M];
long long r_cnt;

void Kruskal()
{
    Init();
    sort( e, e+cnt, Cmp );

    bool flag = false;
    int i;
    int u, v;

    for(i=0;i<cnt;++i)
    {
        u = Find(e[i].u);
        v = Find(e[i].v);

        if(u == v)
            continue;

        if(flag == true && e[i].w == 0)
            continue;
        Union( u, v );
        if(e[i].w == 0)
            ++r_cnt;
        if(r_cnt == k)
            flag = true;
        ind[edge_cnt] = i;
        ++edge_cnt;
        if(edge_cnt == n-1)
            break;
    }

    return ;
}

int main( void )
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    int i;
    int u, v, w;

    cin>>n>>m>>k;

    for(i=1;i<=m;++i)
    {
        cin>>u>>v>>w;
        AddEdge( u, v, w );
    }

    Kruskal();
    if(edge_cnt < n-1 || r_cnt < k)
    {
        cout<<"no solution"<<endl;
        return 0;
    }
    for(i=0;i<edge_cnt;++i)
        cout<<e[ind[i]].u<<' '<<e[ind[i]].v<<' '<<e[ind[i]].w<<endl;

    return 0;
}

第五点WA,求助!

2023/3/18 12:25
加载中...