萌新刚学OI,调了1小时都过不了样例
查看原帖
萌新刚学OI,调了1小时都过不了样例
247555
Fool_Fish楼主2020/10/5 17:00

大佬们救救孩子吧!!!

我的代码(过不了样例)

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=40005;
struct node{
	int u;
	int w;
	node(){}
	node(int U,int W){
		u=U,w=W;
	}
};
struct edge{
	int u,v,w;
};
edge G[MAXN];
vector<node> g[MAXN];
void insert(int u,int v,int w){
	g[u].push_back(node(v,w));
	g[v].push_back(node(u,w));
}
int f[MAXN][20],maxn[MAXN][20],d[MAXN];
int maxm[MAXN][20];//次大 
bool vis[MAXN];
void dfs(int u){
	d[u]=d[f[u][0]]+1;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i].u;
		int w=g[u][i].w;
		if(v==f[u][0]){
			continue; 
		}
		f[v][0]=u;
		maxn[v][0]=w;
		maxm[v][0]=-0x3f3f3f3f;
		dfs(v); 
	}
}
void pre_f(int n){
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
			maxn[i][j]=max(maxn[i][j-1],maxn[f[i][j-1]][j-1]);
			if(maxn[i][j-1]==maxn[f[i][j-1]][j-1]){
				maxm[i][j]=max(maxm[i][j-1],maxm[f[i][j-1]][j-1]);
			}
			else if(maxn[i][j-1]<maxn[f[i][j-1]][j-1]){
				maxm[i][j]=max(maxn[i][j-1],maxm[f[i][j-1]][j-1]);
			}
			else{
				maxm[i][j]=max(maxm[i][j-1],maxn[f[i][j-1]][j-1]);
			}
		}
	}
}
int lca(int x,int y){
	int maxans=-0x3f3f3f3f;
	if(d[x]<d[y]){
		swap(x,y);
	}
	int k=0;
	while((1<<(k+1))<=d[x]) k++;
	for(int j=k;j>=0;j--){
		if(d[f[x][j]]>=d[y]){
			maxans=max(maxans,maxn[x][j]);
			x=f[x][j];
		}
	}
	if(x==y){
		return maxans;
	} 
	for(int j=k;j>=0;j--){
		if(f[x][j]!=f[y][j]){
			maxans=max(maxans,maxn[x][j]);
			maxans=max(maxans,maxn[y][j]);
			x=f[x][j],y=f[y][j];
		}
	}
	return max(maxans,max(maxn[y][0],maxn[x][0]));
}
int fa[MAXN];
int get(int x){
	if(fa[x]==x){
		return x;
	}
	return fa[x]=get(fa[x]);
}
bool cmp(edge x,edge y){
	return x.w<y.w;
}
int sum=0;
int kruskal(int n,int m){
    sort(G+1,G+1+m,cmp);
    for(int i=1;i<=m;i++){
        int fu=get(G[i].u);
        int fv=get(G[i].v);
        if(fu!=fv){
            fa[fv]=fu;
            sum+=G[i].w;
        	vis[i]=true;
        }
        insert(G[i].u,G[i].v,G[i].w);
    }
    return sum;
}
int val1,val2;
void update2(int x){
	if(x>val1){
		val2=val1;
		val1=x;
	}
	else if(x>val2 && x!=val1){
		val2=x;
	}
}
void update(int x,int t){
	update2(maxn[x][t]);
	update2(maxm[x][t]);
}
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	int u,v,w;
	for(int i=1;i<=m;i++){
		scanf("%d %d %d",&G[i].u,&G[i].v,&G[i].w);
	}
	dfs(1);
	pre_f(n);
	int minnest=kruskal(n,m);
	int ans=0x3f3f3f3f; 
	for(int i=1;i<=m;i++){
		if(!vis[i]){
            lca(G[i].u,G[i].v);
            if(val1!=G[i].w){
                ans=min(ans,sum-val1+G[i].w);
			}
            else{
                ans=min(ans,sum-val2+G[i].w);
			}
		}
	}
	printf("%d",ans);
return 0;
}
2020/10/5 17:00
加载中...