没加排序正确性不是也很显然吗,毕竟我枚举了整个区间,只要考虑到我的两个约束条件满不满足就行了,排序是为了满足哪些条件呢,求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;
}