• [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
    贪心,先搞出k条一级路径
    把之后没选的边按
    min(c1,c2)排序

    水题
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 struct Node
     7 {
     8     int u,v,d1,d2,pd,id;
     9 }ed[200001];
    10 int ans,n,k,m,num,set[100001];
    11 bool cmp1(Node a,Node b)
    12 {
    13     return a.d1<b.d1;
    14 }
    15 bool cmp2(Node a,Node b)
    16 {
    17     return min(a.d1,a.d2)<min(b.d1,b.d2);
    18 }
    19 bool cmp3(Node a,Node b)
    20 {
    21     return a.id<b.id;
    22 }
    23 int find(int x)
    24 {
    25     if (set[x]!=x) set[x]=find(set[x]);
    26     return set[x];
    27 }
    28 int main()
    29 {int i,j,u,v,c1,c2,cnt,st;
    30      cin>>n>>k>>m;
    31      m--;
    32       for (i=1;i<=m;i++)
    33       {
    34           scanf("%d%d%d%d",&u,&v,&c1,&c2); 
    35           ed[++num].u=u,ed[num].v=v,ed[num].d1=c1; ed[num].d2=c2;
    36           ed[num].id=i;
    37       }
    38       sort(ed+1,ed+num+1,cmp1);
    39       cnt=0;
    40       for (i=1;i<=n;i++)
    41       set[i]=i;
    42       for (i=1;i<=num;i++)
    43       {
    44            int p=find(ed[i].u),q=find(ed[i].v);
    45            if (p!=q)
    46            {
    47                ans=max(ans,ed[i].d1);
    48                cnt++;
    49                ed[i].pd=1;
    50                set[p]=q;
    51               if (cnt==k) break;
    52            }
    53       }
    54       st=i;
    55       sort(ed+1,ed+num+1,cmp2);
    56       for (i=1;i<=num;i++)
    57       if (ed[i].pd==0)
    58     {
    59           int p=find(ed[i].u),q=find(ed[i].v);
    60            if (p!=q)
    61            {
    62                ans=max(ans,min(ed[i].d1,ed[i].d2));
    63                cnt++;
    64                set[p]=q;
    65                ed[i].pd=2;
    66               if (cnt==n-1) break;
    67            }    
    68       }
    69       cout<<ans<<endl;
    70       sort(ed+1,ed+num+1,cmp3);
    71       for (i=1;i<=num;i++)
    72       if (ed[i].pd)
    73       {
    74           printf("%d %d
    ",ed[i].id,ed[i].pd);
    75       }
    76 } 


  • 相关阅读:
    移动端如何强制页面横屏
    css实现内容渐变隐藏效果,手机网页版知乎内容隐藏效果的实现
    css3中样式计算属性calc()的使用和总结
    如何使用JS操纵伪元素
    HTML5全局属性汇总
    20 个 CSS高级样式技巧汇总
    网页开发中利用CSS以图换字的多中实现方法总汇
    html/css解决inline-block内联元素间隙的多种方法总汇
    [算法] 泊松分布、指数分布
    [算法] 递归
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8094163.html
Copyright © 2020-2023  润新知