洛谷 P2323 [HNOI2006]公路修建問題
阿新 • • 發佈:2017-10-17
評測 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; intc; }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]公路修建問題