1. 程式人生 > >洛谷 P2323 [HNOI2006]公路修建問題

洛谷 P2323 [HNOI2006]公路修建問題

評測 tdi color () code 輸入格式 mes include clas

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





 

洛谷 P2323 [HNOI2006]公路修建問題