记录编号 459423 评测结果 AAAAAAAAAA
题目名称 次小生成树 最终得分 100
用户昵称 GravatarYPZ_979 是否通过 通过
代码语言 C++ 运行时间 0.261 s
提交时间 2017-10-13 09:02:40 内存使用 26.25 MiB
显示代码纯文本
  1. #include<algorithm>
  2. #include<iostream>
  3. #include<iomanip>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cstdio>
  7. #include<queue>
  8. #include<ctime>
  9. #include<cmath>
  10. #include<map>
  11. #include<set>
  12. #define ll long long
  13. using namespace std;
  14. const int maxn=100001;
  15. struct node{
  16. int to,net;
  17. ll w;
  18. }eg[maxn*6],opp[maxn*6];
  19. struct Edge{
  20. int x,y;
  21. ll w;
  22. }e[maxn*3];
  23. int head[maxn],nume;
  24. int head2[maxn],nume2;
  25. int fa[maxn],pd[maxn],IS[maxn],n,m;
  26. ll val[maxn];
  27. int dfn[maxn],Index;
  28. ll sum,ans=1e17;
  29. int comp(const Edge &a,const Edge &b){
  30. return a.w<b.w;
  31. }
  32. bool ok;
  33. int find(int x) {
  34. if(x!=fa[x]) fa[x]=find(fa[x]);
  35. return fa[x];
  36. }
  37. void Union(int x,int y) {
  38. fa[x]=y;
  39. }
  40. void add(int x,int y,ll w) {
  41. eg[++nume].to=y;eg[nume].w=w;eg[nume].net=head[x];head[x]=nume;
  42. }
  43. void add2(int x,int y,ll w) {
  44. opp[++nume2].to=y;opp[nume2].w=w;opp[nume2].net=head2[x];head2[x]=nume2;
  45. }
  46.  
  47. void Kruskal() {
  48. sort(e+1,e+m+1,comp);int i;
  49. for(i=1;i<=n;i++) fa[i]=i;
  50. int k=0;
  51. for(i=1;i<=m;i++) {
  52. int r1=find(e[i].x),r2=find(e[i].y);
  53. if(r1!=r2){
  54. Union(r1,r2);
  55. k++;
  56. sum+=e[i].w;
  57. add(e[i].x,e[i].y,e[i].w);
  58. add(e[i].y,e[i].x,e[i].w);
  59. IS[i]=1;
  60. if(k==n-1) break;
  61. }
  62. }
  63. }
  64.  
  65. void dfs(int x,int fu) {
  66. dfn[x]=++Index;
  67. for(int i=head[x];i;i=eg[i].net) {
  68. int to=eg[i].to;
  69. if(to==fu)continue;
  70. if(!dfn[to]) {
  71. dfs(to,x);
  72. }
  73. }
  74. }
  75.  
  76. void dfs2(int x,int fu) {
  77. for(int i=head[x];i;i=eg[i].net) {
  78. int to=eg[i].to;
  79. if(to==fu)continue;
  80. if(dfn[to]<dfn[x]) continue;
  81. dfs2(to,x);
  82. val[x]=min(val[x],val[to]);
  83. }
  84. }
  85.  
  86. int main() {
  87. freopen("secmst.in","r",stdin);
  88. freopen("secmst.out","w",stdout);
  89. scanf("%d%d",&n,&m);int i;
  90. for(i=1;i<=m;i++) {
  91. scanf("%d%d%lld",&e[i].x,&e[i].y,&e[i].w);
  92. }
  93. Kruskal();
  94. for(i=1;i<=m;i++) if(!IS[i]) add2(e[i].x,e[i].y,e[i].w),add2(e[i].y,e[i].x,e[i].w);
  95. dfs(1,0);
  96. for(i=1;i<=n;i++) val[i]=1e17;
  97. for(int x=1;x<=n;x++){
  98. for(i=head2[x];i;i=opp[i].net) {
  99. val[x]=min(val[x],opp[i].w);
  100. }
  101. }
  102. dfs2(1,0);
  103. for(i=1;i<=m;i++){
  104. if(!IS[i]) continue;
  105. ll kkk=sum;
  106. kkk-=e[i].w;
  107. if(dfn[e[i].x]<dfn[e[i].y]) kkk+=val[e[i].y];
  108. else kkk+=val[e[i].x];
  109. if(kkk<=sum) continue;
  110. ans=min(kkk,ans);
  111. }
  112. cout<<ans;
  113. return 0;
  114. }