[HNOI2006]公路修建问题

Posted Z-Y-Y-S

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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\n",ed[i].id,ed[i].pd);
75       }
76 } 

 



以上是关于[HNOI2006]公路修建问题的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1196: [HNOI2006]公路修建问题

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

1196/P2323 [HNOI2006]公路修建问题

bzoj 1196: [HNOI2006]公路修建问题 二分+并查集

[HNOI2006]公路修建问题

[HNOI2006]公路修建问题