[HNOI2006]公路修建问题
题目描述
输入输出格式
输入格式:在实际评测时,将只会有m-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 }