一个疑问
查看原帖
一个疑问
819273
LIUYC_C楼主2023/8/8 14:46

没加排序正确性不是也很显然吗,毕竟我枚举了整个区间,只要考虑到我的两个约束条件满不满足就行了,排序是为了满足哪些条件呢,求hack 错误代码(60point)

#include <bits/stdc++.h>
using namespace std;
const int N=201010;
int n,k,m;
struct node{
  int a,b,w1,w2;
}tr[N];

int f[N];

int find(int x){
  if(f[x]!=x)f[x]=find(f[x]);
 return f[x];
}

int krskal(int g,int id){
  for(int i=1;i<=n;i++){
    f[i]=i;
  }
  
  int cnt=0;
  int tim=0;
  
  for(int i=1;i<m;i++){
    int a=tr[i].a,b=tr[i].b,w1=tr[i].w1,w2=tr[i].w2;
    if(find(a)!=find(b)&&w2<=g){
        cnt++;
        f[find(a)]=find(b);
        if(w1<=g){
          if(id==1)cout<<i<<" "<<1<<endl;
          tim++;
        }
        else{
          if(id==1){
              cout<<i<<"  "<<2<<endl;
          }
        }
    }
  }
  if(cnt<n-1||tim<k)return false;
  return true;
}



int main(){
  cin>>n>>k>>m;
  int maxl=0;
  for(int i=1;i<m;i++){
    int a,b,w1,w2;
    cin>>a>>b>>w1>>w2;
    maxl=max(maxl,w1);
    tr[i]={a,b,w1,w2};
  }
  
  int l=1,r=3e5;
  while(l<r){
    int mid=l+r>>1;
    if(!krskal(mid,0))l=mid+1;
    else r=mid;
  }
  cout<<l<<endl;
  krskal(l,1);
  return 0;
}

正确代码(加了排序)

#include <bits/stdc++.h>
using namespace std;
const int N=201010;
int n,k,m;
struct node{
  int a,b,w1,w2;
  int id;
}tr[N];

int f[N];

int find(int x){
  if(f[x]!=x)f[x]=find(f[x]);
 return f[x];
}

bool cmp(node a,node b){
    if(a.w1==b.w1)return a.w2<b.w2;
    return a.w1<b.w1;
}

int krskal(int g,int id){
  for(int i=1;i<=n;i++){
    f[i]=i;
  }
  
  int cnt=0;
  int tim=0;
  for(int i=1;i<m;i++){
    int a=tr[i].a,b=tr[i].b,w1=tr[i].w1,w2=tr[i].w2;
    if(find(a)!=find(b)&&w2<=g){
        cnt++;
        f[find(a)]=find(b);
        if(w1<=g){
          if(id==1)cout<<tr[i].id<<" "<<1<<endl;
          tim++;
        }
        else{
          if(id==1){
              cout<<tr[i].id<<"  "<<2<<endl;
          }
        }
    }
  }
  if(cnt<n-1||tim<k)return false;
  return true;
}



int main(){
  cin>>n>>k>>m;
  int maxl=0;
  for(int i=1;i<m;i++){
    int a,b,w1,w2;
    cin>>a>>b>>w1>>w2;
    maxl=max(maxl,w1);
    tr[i]={a,b,w1,w2,i};
  }
  sort(tr+1,tr+m,cmp);
  int l=1,r=3e5;
  while(l<r){
    int mid=l+r>>1;
    if(!krskal(mid,0))l=mid+1;
    else r=mid;
  }
  cout<<l<<endl;
  krskal(l,1);
  return 0;
}
2023/8/8 14:46
加载中...