洛谷 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; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。