dalao求助#1
查看原帖
dalao求助#1
808957
alone_lkx楼主2022/10/25 12:53
```cpp
#include<bits/stdc++.h>
using namespace std;
#define rank xzy
const int N=1e5+1;
const int M=3e5+1;
int cnt=0;long long sum=0;
struct edge{
	int u,v,w;
}e[M];
bool cmp(edge a,edge b){return a.w<b.w;}
int n,m;
int fa[N],rank[N],vis[N],pre[N],con[5000][5000];
queue<edge>q;
inline int find(int x){
	if(fa[x]==x)return x;
	else return find(fa[x]);
}
inline void merge(int u,int v,int w){
	u=find(u);v=find(v);
	if(rank[u]<rank[v]){
		fa[u]=v;
		pre[u]=w;
	}
	else{
		fa[v]=u;
		pre[v]=w;
		if(rank[u]==rank[v])rank[u]++;
	}
}
inline void init(){
	for(int i=1;i<=n;i++){
		fa[i]=i;rank[i]=0;vis[i]=-1;
	}
	sort(e+1,e+cnt+1,cmp);
	for(int i=1;i<=cnt;i++){
		int u=find(e[i].u);int v=find(e[i].v);
		if(u==v)
			q.push(edge{e[i].u,e[i].v,e[i].w});
		else{
			sum+=e[i].w;
			merge(u,v,e[i].w);
		}
	}
}
inline int query(int s,int t,int x){
	if(find(s)!=find(t))return -0x3f3f3f3f;
	int ans=-3,mx2=-4;
	int k=s;
	while(1){
		vis[k]=ans;
		if(fa[k]==k)break;
		if(pre[k]>ans)mx2=ans,ans=pre[k];
		else{
			if(pre[k]>mx2)mx2=pre[k];
		}
		k=fa[k];
	}
	ans=-3;k=t;
	int ans2=-56;
	while(1){
		if(vis[k]>=0){
			if(vis[k]>ans){
				ans2=max(mx2,ans);ans=vis[k];
			}
			else{
				ans2=max(ans2,vis[k]);
			}
			break;
		}
		if(fa[k]==k)break;
		if(pre[k]>ans)ans2=ans,ans=pre[k];
		else{
			if(pre[k]>ans2)ans2=pre[k];
		}
		k=fa[k];
	}
	k=s;
	while(1){
		vis[k]=-1;
		if(fa[k]==k)break;
		k=fa[k];
	}
	if(ans!=x)return ans;
	else return ans2;
}
inline long long min(int a,long long b){
	if(a>b)return b;
	else return a;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		++cnt;
		cin>>e[cnt].u>>e[cnt].v>>e[cnt].w;
		if(e[cnt].u==e[cnt].v)cnt--;
	}
	init();
	long long mn=0x3f3f3f3f3f3f3f3f;
	while(!q.empty()){
		edge t=q.front();q.pop();
		int u=t.u;int v=t.v;
		int temp;
		temp=t.w-query(u,v,t.w);
		if(temp==0)continue;
		mn=min(mn,temp);
	}
	cout<<sum+mn;
	return 0;
}

不知道为什么其他数据都能过,就是#1过不了

2022/10/25 12:53
加载中...