[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 } 

 



转载于:https://www.cnblogs.com/Y-E-T-I/p/8094163.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值