- 宿命的PSS
- 2017-07-25 23:16:31 @
/*宿命的PSS(www.vijos.org/p/1579)
从最小边搜起,
已搜过的两点间边权为w(w=已搜边权最大值+1),
结果即为答案. */
#include <iostream>
#include <algorithm>
using namespace std;
int n,i,j,k=1;
int ans=0;
bool vis[20050][20050];
struct jl//way
{
int s,e,w;//start,end,weight
} arr[20050];
bool cmp(jl a,jl b)
{
return a.w<b.w;
}
int bcj[20050];//'bing_cha_ji'
void ji()//memset'bing_cha_ji'
{
for(int i=1;i<=n;i++)
bcj[i]=i;
}
int cha(int i)
{
if (bcj[i]==i) return i;
return bcj[i]=cha(bcj[i]);
}
void bing(int x,int y)
{
bcj[cha(x)]=cha(y);
}
int main()
{
cin>>n;
ji();
for(i=1;i<=n-1;i++)
{
int s,e,w;
cin>>s>>e>>w;
arr[k].s=s,arr[k].e=e,arr[k].w=w,k++;
}
k--;
/*input&memset*/
sort(arr+1,arr+1+k,cmp);
/*sort the ways*/
for(int i=1;i<=k;i++)
{
if(cha(arr[i].s)!=cha(arr[i].e))
{
ans+=arr[i].w;
vis[arr[i].s][arr[i].e]=1;
vis[arr[i].e][arr[i].s]=1;
bing(arr[i].s,arr[i].e);
for(int x=1;x<=n;x++)
for(int y=1;y<=n;y++)
if(vis[x][y]==0&&x!=y)
{
if(cha(x)==cha(y))
vis[x][y]=vis[y][x]=1,ans+=arr[i].w+1;
}
}
}
/*main*/
cout<<ans<<endl;
/*output*/
}
0 条评论
目前还没有评论...