洛谷 P2323 [HNOI2006]公路修建问题

题目描述

输入输出格式

输入格式:

 

在实际评测时,将只会有m-1行公路

 

输出格式:

 

 

输入输出样例

输入样例#1:
4 2 5
1 2 6 5
1 3 3 1
2 3 9 4
2 4 6 1
3 4 4 2
输出样例#1:
4
2 1
3 2
5 1
输入样例#2:
4 1 5
1 2 6 5
1 3 3 1
2 3 9 4
2 4 6 1
3 4 4 3
输出样例#2:
3
2 1
4 2
5 2
思路:贪心+Kruskal
注意这句话,没有注意到,坑了我很久
悲壮的评测记录:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 5000000
using namespace std;
int n,k,m,fa[MAXN],num,maxn=-1;
struct nond{
    int a,b,c1,c2,id,c;
}edge[MAXN];
struct none{
    int id;
    int c;
}ans[MAXN];
int cmp(nond x,nond y){
    return x.c1<y.c1;
}
int cmp1(nond x,nond y){
    return x.c2<y.c2;
}
int cmp2(none x,none y){
    return x.id<y.id;
}
int find(int x){
    if(fa[x]==x)    return fa[x];
    else return fa[x]=find(fa[x]);
}
int main(){
    scanf("%d%d%d",&n,&k,&m);
    for(int i=1;i<m;i++){
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        edge[i].a=a;
        edge[i].b=b;
        edge[i].c1=c;
        edge[i].c2=d;
        edge[i].id=i;
    }
    sort(edge+1,edge+m,cmp);
    for(int i=1;i<=n;i++)    fa[i]=i;
    for(int i=1;i<m;i++){
        int dx=find(edge[i].a);
        int dy=find(edge[i].b);
        if(dx==dy)    continue;
        fa[dx]=dy;
        num++;
        maxn=max(edge[i].c1,maxn);
        ans[num].id=edge[i].id;
        ans[num].c=1;
        if(num==k)    break;
        if(num==n-1)    break;
    }
    sort(edge+1,edge+m,cmp1);
    for(int i=1;i<m;i++){ 
        int dx=find(edge[i].a);
        int dy=find(edge[i].b);
        if(dx==dy)    continue;
        fa[dx]=dy;
        num++;
        maxn=max(edge[i].c2,maxn);
        ans[num].id=edge[i].id;
        if(edge[i].c==edge[i].c1)    ans[num].c=1;
        else ans[num].c=2;
        if(num==n-1)    break;
    }
    sort(ans+1,ans+1+num,cmp2);
    cout<<maxn<<endl;
    for(int i=1;i<=num;i++)
        cout<<ans[i].id<<" "<<ans[i].c<<endl;
}

 


 




 

 
posted @ 2017-10-17 17:41  一蓑烟雨任生平  阅读(160)  评论(0编辑  收藏  举报