[关闭]
@darkproject 2017-04-22T10:45:55.000000Z 字数 841 阅读 706

在此处输入标题

未分类


在此输入正文

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn=500*500+10;
  6. struct edge
  7. {
  8. int from,to;
  9. int cost;
  10. }mxr[maxn];
  11. int par[maxn];
  12. int n;
  13. int cmp(edge a,edge b)
  14. {
  15. return a.cost<b.cost;
  16. }
  17. void init(){
  18. for(int i=1;i<=n;i++)
  19. par[i]=i;
  20. }
  21. int find(int x)
  22. {
  23. if(par[x]==x)
  24. return x;
  25. return par[x]=find(par[x]);
  26. }
  27. void unite(int x,int y)
  28. {
  29. x=find(x);
  30. y=find(y);
  31. if(x!=y)
  32. par[x]=y;
  33. }
  34. bool same(int x,int y)
  35. {
  36. return find(x)==find(y);
  37. }
  38. int kruskal()
  39. {
  40. int res=0;
  41. int k=n*(n-1)/2;
  42. sort(mxr+1,mxr+k+1,cmp);
  43. for(int i=1;i<=k;i++)
  44. {
  45. if(same(mxr[i].from,mxr[i].to))
  46. continue;
  47. unite(mxr[i].from,mxr[i].to);
  48. res+=mxr[i].cost;
  49. }
  50. return res;
  51. }
  52. int main()
  53. {
  54. int flag;
  55. while(scanf("%d",&n),n)
  56. {
  57. init();
  58. for(int i=1;i<=n*(n-1)/2;i++)
  59. {
  60. for(int j=1;j<=4;j++)
  61. {
  62. scanf("%d %d",&mxr[i].from,&mxr[i].to);
  63. scanf("%d %d",&mxr[i].cost,&flag);
  64. if(flag) unite(mxr[i].from,mxr[i].to);
  65. }
  66. }
  67. printf("%d\n",kruskal());
  68. }
  69. return 0;
  70. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注