萌新求助
查看原帖
萌新求助
57779
LRL65楼主2020/7/21 21:07

80分,第八个点和第十个点wa。请求大佬帮忙,谢谢。

代码如下。

#include<bits/stdc++.h>
using namespace std;
#define MAXN 300005
const long long INF= 2147483647000000;
int head[MAXN],fa[MAXN],dep[MAXN],vis[MAXN]={0},f[MAXN][24],tot,n,m,q,sum=0,maxn=0;
long long dp1[MAXN][24],dp2[MAXN][24],ans=INF;
struct edge1{
    int x,y,dis;
}e1[MAXN*3];
struct edge2{
    int to,nxt,val;
}e2[MAXN*3];
void add(int x,int y,int w){
    e2[++tot].to=y;e2[tot].nxt=head[x];e2[tot].val=w;head[x]=tot;
}
bool cmp(edge1 a,edge1 b) {
    return a.dis<b.dis;
}
int find(int x)  {
    if(fa[x]!=x)fa[x]=find(fa[x]);
    return fa[x];
}
void unionn(int a,int b) {
    int f1a=find(a),fb=find(b);
    if(f1a!=fb)fa[f1a]=fb;
}
void kruskal() {
    sort(e1+1,e1+m+1,cmp);
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=m;i++)
        if(find(e1[i].x)!=find(e1[i].y)){
            vis[i]=1;
            unionn(e1[i].x,e1[i].y);
            add(e1[i].x,e1[i].y,e1[i].dis);add(e1[i].y,e1[i].x,e1[i].dis);
            sum+=e1[i].dis;maxn=max(maxn,e1[i].dis);
        }
}
void dfs(int u,int fa){
    dep[u]=dep[fa]+1;
    for(int i=1;i<=23;i++) {
        f[u][i]=f[f[u][i-1]][i-1];
        dp1[u][i]=max(dp1[u][i-1],dp1[f[u][i-1]][i-1]);
        dp2[u][i]=max(dp2[u][i-1],dp2[f[u][i-1]][i-1]);
        if(dp1[u][i-1]!=dp1[f[u][i-1]][i-1]) dp2[u][i]=max(dp2[u][i],min(dp1[u][i-1],dp1[f[u][i-1]][i-1]));
    }
    for(int i=head[u];i;i=e2[i].nxt) {
        int v=e2[i].to;
        if(v==fa)continue;
        f[v][0]=u;dp1[v][0]=e2[i].val;
        dfs(v,u);
    }
}
int LCA(int x,int y) {
	if(dep[x]<dep[y])swap(x,y);
	for(int i=23;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];
	if(x==y)return x;
	for(int i=23;i>=0;i--) {
		if(f[x][i]!=f[y][i]) {
			x=f[x][i];y=f[y][i];
		}
	}
	return f[x][0];
}
long long sum1(int u,int v,int w){
	int lca1=LCA(u,v);
	long long max1=-1,max2=-1;
	for(int i=23,h1=dep[u]-dep[lca1],h2=dep[v]-dep[lca1];i>=0;i--){
		if(h1&(1<<i)){
			if(dp1[u][i]>max1) max2=max1,max1=dp1[u][i];
            if(max1>dp1[u][i])max2=max(max2,dp1[u][i]);
			max2=max(max2,dp2[u][i]);
           
		}
        if(h2&(1<<i)){
			if(dp1[v][i]>max1)max2=max1,max1=dp1[v][i];
            if(max1>dp1[v][i])max2=max(max2,dp1[v][i]);
			max2=max(max2,dp2[v][i]);
		}
	}
	if(max1!=w)return w-max1;
	if(max2!=-1)return w-max2; 
	return 0;
}
int main() {
    cin>>n>>m;
    for(int i=1;i<=m;i++) {
        int x,y,z;
        cin>>x>>y>>z;
        e1[i].x=x;e1[i].y=y;e1[i].dis=z;
    }
    kruskal();dfs(1,0);
    for(int i=1;i<=m;i++)
        if(vis[i]==0) {
            if(e1[i].dis-maxn>ans) break;
            long long t=sum1(e1[i].x,e1[i].y,e1[i].dis);
            if(t!=0)ans=min(ans,t);
        }
    cout<<ans+sum<<endl;
}
2020/7/21 21:07
加载中...