zoukankan      html  css  js  c++  java
  • 洛谷 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;
    }
    
    
    
    
    
    



     
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    PS学习之餐饮行业修图
    python的IDE选择
    python简介与安装
    selenium不能启动firefox浏览器,怎么办?
    selenium定位元素(python)
    如何解决Selenium IDE与Firefox的不兼容问题?
    手工测试的关注点之用户管理
    《Google 测试之道》有感(一)
    LR性能测试衡量指标
    LR集合点与事务
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7682995.html
Copyright © 2011-2022 走看看