求助!86分,WAon#1
查看原帖
求助!86分,WAon#1
635570
baka24楼主2023/9/24 13:54
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=200010,M=1011451423,M2=11451403,M3=114514191981019,M4=114514191981000001;unsigned long long base=131;
int n,m,k,fa[MAXN],ans[MAXN];
struct Edge{
    int u,v,w,t;
}a[MAXN];
int find(int x){
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}
bool cmp1(Edge x,Edge y){
    return x.w>y.w;
}
bool cmp2(Edge x,Edge y){
    return x.t<y.t;
}
bool check(){
    for(int i=1;i<=n;i++){
        if(find(1)!=find(i))return 0;
    }
    return  1;
}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&k);
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=m;i++){
        scanf("%lld%lld%lld",&a[i].u,&a[i].v,&a[i].w);
    }
    sort(a+1,a+m+1,cmp1);
    int cnt=0;
    for(int i=1;i<=m;i++){
        int x=find(a[i].u),y=find(a[i].v);
        if(x!=y){
            fa[x]=fa[y];
            if(a[i].w==0){
                cnt++,a[i].t=1;
                //cout<<a[i].t<<endl;
            }
        }
    }
    for(int i=1;i<=m;i++){
        if(!a[i].t)a[i].t=2;
        if(a[i].w==1)a[i].t=3;
    }
    if(cnt>k||!check()){printf("no solution");return 0;}
    sort(a+1,a+m+1,cmp2);cnt=0;int tot=0;
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=m;i++){
        int x=find(a[i].u),y=find(a[i].v);
            if(x!=y){
                if(a[i].w==1||cnt<k){
                    ans[++tot]=i;
                    fa[x]=fa[y];
                    cnt++;
                }
                    //cout<<a[i].w<<" "<<i<<" "<<cnt<<" "<<k<<endl;
            }
            //cout<<x<<" "<<y<<endl;
    }
    if(cnt<k||!check()){printf("no solution");return 0;}
    for(int i=1;i<=tot;i++){
        printf("%lld %lld %lld\n",a[ans[i]].u,a[ans[i]].v,a[ans[i]].w);
    }
    return 0;
}

有没有大佬帮帮忙,孩子已经改了一个上午了!!QAQQAQ

2023/9/24 13:54
加载中...