记录编号 |
459423 |
评测结果 |
AAAAAAAAAA |
题目名称 |
次小生成树 |
最终得分 |
100 |
用户昵称 |
YPZ_979 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.261 s |
提交时间 |
2017-10-13 09:02:40 |
内存使用 |
26.25 MiB |
显示代码纯文本
- #include<algorithm>
- #include<iostream>
- #include<iomanip>
- #include<cstring>
- #include<cstdlib>
- #include<cstdio>
- #include<queue>
- #include<ctime>
- #include<cmath>
- #include<map>
- #include<set>
- #define ll long long
- using namespace std;
- const int maxn=100001;
- struct node{
- int to,net;
- ll w;
- }eg[maxn*6],opp[maxn*6];
- struct Edge{
- int x,y;
- ll w;
- }e[maxn*3];
- int head[maxn],nume;
- int head2[maxn],nume2;
- int fa[maxn],pd[maxn],IS[maxn],n,m;
- ll val[maxn];
- int dfn[maxn],Index;
- ll sum,ans=1e17;
- int comp(const Edge &a,const Edge &b){
- return a.w<b.w;
- }
- bool ok;
- int find(int x) {
- if(x!=fa[x]) fa[x]=find(fa[x]);
- return fa[x];
- }
- void Union(int x,int y) {
- fa[x]=y;
- }
- void add(int x,int y,ll w) {
- eg[++nume].to=y;eg[nume].w=w;eg[nume].net=head[x];head[x]=nume;
- }
- void add2(int x,int y,ll w) {
- opp[++nume2].to=y;opp[nume2].w=w;opp[nume2].net=head2[x];head2[x]=nume2;
- }
-
- void Kruskal() {
- sort(e+1,e+m+1,comp);int i;
- for(i=1;i<=n;i++) fa[i]=i;
- int k=0;
- for(i=1;i<=m;i++) {
- int r1=find(e[i].x),r2=find(e[i].y);
- if(r1!=r2){
- Union(r1,r2);
- k++;
- sum+=e[i].w;
- add(e[i].x,e[i].y,e[i].w);
- add(e[i].y,e[i].x,e[i].w);
- IS[i]=1;
- if(k==n-1) break;
- }
- }
- }
-
- void dfs(int x,int fu) {
- dfn[x]=++Index;
- for(int i=head[x];i;i=eg[i].net) {
- int to=eg[i].to;
- if(to==fu)continue;
- if(!dfn[to]) {
- dfs(to,x);
- }
- }
- }
-
- void dfs2(int x,int fu) {
- for(int i=head[x];i;i=eg[i].net) {
- int to=eg[i].to;
- if(to==fu)continue;
- if(dfn[to]<dfn[x]) continue;
- dfs2(to,x);
- val[x]=min(val[x],val[to]);
- }
- }
-
- int main() {
- freopen("secmst.in","r",stdin);
- freopen("secmst.out","w",stdout);
- scanf("%d%d",&n,&m);int i;
- for(i=1;i<=m;i++) {
- scanf("%d%d%lld",&e[i].x,&e[i].y,&e[i].w);
- }
- Kruskal();
- 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);
- dfs(1,0);
- for(i=1;i<=n;i++) val[i]=1e17;
- for(int x=1;x<=n;x++){
- for(i=head2[x];i;i=opp[i].net) {
- val[x]=min(val[x],opp[i].w);
- }
- }
- dfs2(1,0);
- for(i=1;i<=m;i++){
- if(!IS[i]) continue;
- ll kkk=sum;
- kkk-=e[i].w;
- if(dfn[e[i].x]<dfn[e[i].y]) kkk+=val[e[i].y];
- else kkk+=val[e[i].x];
- if(kkk<=sum) continue;
- ans=min(kkk,ans);
- }
- cout<<ans;
- return 0;
- }