进食后人
查看原帖
进食后人
953589
coderJerry楼主2024/10/25 20:02

不要压行!不然就会像愚蠢的我一样 58 分!全世界只有我会犯这种错误了。。。

//58pts
#include <bits/stdc++.h>
using namespace std;
int fa[20010],n,m,k,cnt=0,cnt1=0,cur=0;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x,int y){fa[find(x)]=find(y);}
struct node{
    int u,v,w;bool f=0,ok=0;
}e[100010];
bool cmp(node a,node b){return a.w<b.w;}
int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        int x,y,z;++cur;
        cin>>x>>y>>z;
        e[cur].u=x;e[cur].v=y;e[cur].w=1-z;
    }
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=m;i++){
        if(find(fa[e[i].u])!=find(fa[e[i].v])&&cnt<n-1){
            cnt++;
            merge(e[i].u,e[i].v);
            if(e[i].w==1){
                e[i].f=1;
                cnt1++;
                e[i].ok=1;
            }
        }
    }
    if(m<k||cnt1>k){cout<<"no solution"<<endl;return 0;}
    for(int i=1;i<=n;i++) fa[i]=i;
    int val=0;
    for(int i=1;i<=m&&e[i].f==1;i++){merge(e[i].u,e[i].v);val++;}
    for(int i=1;i<=m&&e[i].f==0;i++){
        if(find(fa[e[i].u])!=find(fa[e[i].v])&&cnt1<k&&e[i].w==1){
            merge(e[i].u,e[i].v);
            ++cnt1;
            e[i].ok=1;
            val++;
        }
    }
    if(cnt1!=k){cout<<"no solution"<<endl;return 0;}
    cnt=k;
    for(int i=1;i<=m&&e[i].w==0;i++){
        if(find(fa[e[i].u])!=find(fa[e[i].v])&&cnt<n-1){
            cnt++;
            merge(e[i].u,e[i].v);
            e[i].ok=1;
        }
    }
    for(int i=1;i<=m;i++) if(e[i].ok==1) cout<<e[i].u<<" "<<e[i].v<<" "<<1-e[i].w<<endl;
    return 0;
}
//AC
#include <bits/stdc++.h>
using namespace std;
int fa[20010],n,m,k,cnt=0,cnt1=0,cur=0;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x,int y){fa[find(x)]=find(y);}
struct node{
    int u,v,w;bool f=0,ok=0;
}e[100010];
bool cmp(node a,node b){return a.w<b.w;}
int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        int x,y,z;++cur;
        cin>>x>>y>>z;
        e[cur].u=x;e[cur].v=y;e[cur].w=1-z;
    }
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=m;i++){
        if(find(fa[e[i].u])!=find(fa[e[i].v])&&cnt<n-1){
            cnt++;
            merge(e[i].u,e[i].v);
            if(e[i].w==1){
                e[i].f=1;
                cnt1++;
                e[i].ok=1;
            }
        }
    }
    if(m<k||cnt1>k){cout<<"no solution"<<endl;return 0;}
    for(int i=1;i<=n;i++) fa[i]=i;
    int val=0;
    for(int i=1;i<=m;i++) if(e[i].f==1){merge(e[i].u,e[i].v);val++;}
    for(int i=1;i<=m;i++){
        if(e[i].f==0&&find(fa[e[i].u])!=find(fa[e[i].v])&&cnt1<k&&e[i].w==1){
            merge(e[i].u,e[i].v);
            ++cnt1;
            e[i].ok=1;
            val++;
        }
    }
    if(cnt1!=k){cout<<"no solution"<<endl;return 0;}
    cnt=k;
    for(int i=1;i<=m;i++){
        if(e[i].w==0&&find(fa[e[i].u])!=find(fa[e[i].v])&&cnt<n-1){
            cnt++;
            merge(e[i].u,e[i].v);
            e[i].ok=1;
        }
    }
    for(int i=1;i<=m;i++) if(e[i].ok==1) cout<<e[i].u<<" "<<e[i].v<<" "<<1-e[i].w<<endl;
    return 0;
}
2024/10/25 20:02
加载中...