[关闭]
@ysner 2018-05-22T13:48:19.000000Z 字数 1443 阅读 1710

[APIO2008]免费道路

并查集


题面

戳我

解析

先找出必须要的鹅卵石路。(可以通过先连上所有水泥路再看是否需要连鹅卵石路)
于是下一次,先连上必须要的鹅卵石路,再随便找水泥路连上。
因为每连一条路,都是把两个并查集连起来,没有优劣之分。
据说还要判图不联通的情况???

  1. // luogu-judger-enable-o2
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<cstdlib>
  6. #include<cstring>
  7. #include<algorithm>
  8. #define ll long long
  9. #define re register
  10. #define il inline
  11. #define inf 1000000009
  12. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  13. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  14. using namespace std;
  15. const int N=5e5+100;
  16. int n,m,k,u[N],v[N],c[N],num[2],u0[N],v0[N],c0[N],t,f[N];
  17. bool vis[N];
  18. il int gi()
  19. {
  20. re int x=0,t=1;
  21. re char ch=getchar();
  22. while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
  23. if(ch=='-') t=-1,ch=getchar();
  24. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  25. return x*t;
  26. }
  27. -----il int find(re int x){return f[x]==x?x:f[x]=find(f[x]);}-----
  28. il void solve(re int ysn,re int mx)
  29. {
  30. fp(i,1,m)
  31. if(c[i]==ysn&&num[ysn]<mx)
  32. {
  33. re int a=find(u[i]),b=find(v[i]);
  34. if(a^b)
  35. {
  36. f[a]=b;
  37. u0[++t]=u[i],v0[t]=v[i],c0[t]=c[i];
  38. vis[i]=1;num[ysn]++;
  39. }
  40. }
  41. }
  42. int main()
  43. {
  44. n=gi();m=gi();k=gi();
  45. fp(i,1,m) u[i]=gi(),v[i]=gi(),c[i]=gi();
  46. scanf("%d%d%d",&n,&m,&k);
  47. fp(i,1,m) scanf("%d%d%d",&u[i],&v[i],&c[i]);
  48. fp(i,1,n) f[i]=i;
  49. num[0]=num[1]=0;
  50. solve(1,inf);solve(0,inf);
  51. if(num[1]+num[0]!=n-1||num[0]>k) {puts("no solution");return 0;}
  52. t=0;num[0]=num[1]=0;fp(i,1,n) f[i]=i;
  53. fp(i,1,m)
  54. if(!c[i]&&vis[i])
  55. {
  56. re int a=find(u[i]),b=find(v[i]);
  57. if(a^b)
  58. {
  59. f[a]=b;num[0]++;
  60. u0[++t]=u[i],v0[t]=v[i],c0[t]=c[i];
  61. }
  62. }
  63. solve(0,k);solve(1,inf);
  64. if(num[0]<k) {puts("no solution");return 0;}
  65. fp(i,1,t) printf("%d %d %d\n",u0[i],v0[i],c0[i]);
  66. return 0;
  67. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注