mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
Create 5723_yuanbo123.cpp
From http://www.cnblogs.com/yuanbo123/p/5687595.html
This commit is contained in:
parent
464fe15f53
commit
b99d71e24e
99
HDOJ/5723_yuanbo123.cpp
Normal file
99
HDOJ/5723_yuanbo123.cpp
Normal file
|
@ -0,0 +1,99 @@
|
|||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
#define LL long long
|
||||
#define N 100010
|
||||
#define M 1000010
|
||||
vector<pair<int,int> > v[N];//定义一个pair型的主要是因为要在v[].second中储存路径权值
|
||||
struct node
|
||||
{
|
||||
int a,b,w;
|
||||
} edge[M];//储存每条边
|
||||
int father[N],vis[N];
|
||||
int n,m;
|
||||
long long ans;//记录总权值;
|
||||
bool cmp(node x,node y)
|
||||
{
|
||||
return x.w<y.w;
|
||||
}
|
||||
int finds(int x)
|
||||
{
|
||||
return father[x]==x?x:father[x]=finds(father[x]);
|
||||
}
|
||||
long long dfs(int x) //dfs递归搜索
|
||||
{
|
||||
vis[x]=1;
|
||||
//标记顶点避免死循环
|
||||
int i;
|
||||
long long nb=0,cb=0;
|
||||
int h=v[x].size();
|
||||
for(i=0;i<h;i++)
|
||||
{
|
||||
int b=v[x][i].first;
|
||||
if(!vis[b])
|
||||
{
|
||||
nb=dfs(b);
|
||||
cb+=nb;
|
||||
ans+=nb*(n-nb)*v[x][i].second;
|
||||
}
|
||||
}
|
||||
return 1+cb;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,i;
|
||||
long long sum;
|
||||
cin>>t;
|
||||
while(t--)
|
||||
{
|
||||
for(i=0; i<=N; i++)
|
||||
v[i].clear();
|
||||
memset(vis,0,sizeof(vis));
|
||||
ans=0;
|
||||
sum=0;
|
||||
int flag=0;
|
||||
scanf("%d%d",&n,&m);
|
||||
if(n==0||m==0)
|
||||
{
|
||||
printf("0 0.00\n");
|
||||
continue;
|
||||
}
|
||||
for(i=1; i<=n; i++)
|
||||
{
|
||||
father[i]=i;
|
||||
}
|
||||
for(i=0; i<m; i++)
|
||||
{
|
||||
scanf("%d%d%d",&edge[i].a,&edge[i].b,&edge[i].w);
|
||||
}
|
||||
sort(edge,edge+m,cmp);
|
||||
for(i=0; i<m; i++)
|
||||
{
|
||||
int fx=finds(edge[i].a);
|
||||
int fy=finds(edge[i].b);
|
||||
if(fx!=fy)
|
||||
{
|
||||
flag++;
|
||||
father[fx]=fy;
|
||||
sum+=edge[i].w;
|
||||
v[edge[i].a].push_back(make_pair(edge[i].b,edge[i].w));
|
||||
v[edge[i].b].push_back(make_pair(edge[i].a,edge[i].w));
|
||||
}
|
||||
if(flag==n-1)
|
||||
break;
|
||||
}
|
||||
for(i=1; i<=n; i++)
|
||||
{
|
||||
if(v[i].size()==1)
|
||||
break;
|
||||
}
|
||||
dfs(i);
|
||||
double y=1.0*n*(n-1)/2;
|
||||
printf("%I64d %.2lf\n",sum,(double)ans/y);
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user