萌新刚学NOI,程序漏洞百出,错误不断。
愿各位大佬出手相助。
最后加三个膜拜%%%
因为代码风格不好,所以还请各位大佬耐心看下去qwq
#include <bits/stdc++.h>
using namespace std;
struct Edge
{
int x,y,s,kkk;
};
vector<Edge>pp[3001];
int f[3001][30],g[3001][30],dep[3001];
int max_max=0;
int max_ans=0xcf;
bool cmp(Edge x,Edge y)
{
return x.s<y.s;
}
Edge kk[3001];int fat[1001];
int find(int x)
{
if(x==fat[x]) return x;
return fat[x]=find(fat[x]);
}
void dfs(int now)
{
for(int i=0;i<pp[now].size();i++)
{
int p=pp[now][i].y;
dep[p]=dep[now]+1;
f[p][0]=now;g[p][0]=pp[now][i].s;
for(int i=1;i<=25;i++)
{
f[p][i]=f[f[p][i-1]][i-1];
g[p][i]=max(g[p][i-1],g[f[p][i-1]][i-1]);
}
dfs(p);
}
}
int take_the_best(int pp1,int pp2)
{
int ans=-0x7f;
if(dep[pp1]<dep[pp2]) swap(pp1,pp2);
for(int i=30;i>=0;i--)
{
if(dep[f[pp1][i]]>=dep[pp2])
{
ans=max(ans,g[pp1][i]);
pp1=f[pp1][i];
}
}
if(pp1==pp2) return ans;
for(int i=30;i>=0;i--)
{
if(f[pp1][i]!=f[pp2][i])
{
ans=max(ans,max(g[pp1][i],g[pp2][i]));
pp1=f[pp1][i];
pp2=f[pp2][i];
}
}
return max(ans,max(g[pp1][0],g[pp2][0]));
}
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>kk[i].x>>kk[i].y>>kk[i].s;
}
sort(kk+1,kk+m+1,cmp);
for(int i=1;i<=n-1;i++)
{
int p1=find(kk[i].x),p2=find(kk[i].y);
if(fat[p1]==fat[p2])
{
kk[i].kkk=1;
continue;
}
kk[i].kkk=0;
max_max+=kk[i].s;
fat[p1]=fat[p2];
pp[kk[i].x].push_back((Edge){kk[i].x,kk[i].y,kk[i].s,});
pp[kk[i].y].push_back((Edge){kk[i].y,kk[i].x,kk[i].s,});
}
dfs(1);
for(int i=1;i<=n;i++)
{
if(kk[i].kkk==1)
{
max_ans=min(max_ans,max_max-take_the_best(kk[i].x,kk[i].y)+kk[i].s);
}
}
cout<<max_ans<<endl;
}
qwqqwq求助!