mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
Create 5723.cpp
This commit is contained in:
parent
b99d71e24e
commit
adeccbcc64
113
HDOJ/5723.cpp
Normal file
113
HDOJ/5723.cpp
Normal file
|
@ -0,0 +1,113 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
#define MAXN 100100
|
||||
#define MAXM 1000100
|
||||
#define MAXW 1000100
|
||||
using LL = long long;
|
||||
struct edge
|
||||
{
|
||||
int u,v,w;
|
||||
};
|
||||
bool cmp(const edge& a,const edge& b)
|
||||
{
|
||||
return a.w<b.w;
|
||||
}
|
||||
edge bus[MAXM];
|
||||
int father[MAXN];
|
||||
char vis[MAXN];
|
||||
|
||||
/// Global For DFS
|
||||
int n,m;
|
||||
|
||||
vector<pair<int,int>> vec[MAXN];
|
||||
|
||||
int findfather(int x)
|
||||
{
|
||||
return father[x]==x?x:father[x]=findfather(father[x]);
|
||||
}
|
||||
|
||||
LL totalans;
|
||||
|
||||
LL dfs(int index)
|
||||
{
|
||||
vis[index]=1;
|
||||
int sz=vec[index].size();
|
||||
LL ksum=0;
|
||||
LL nextans=0;
|
||||
for(int i=0;i<sz;i++)
|
||||
{
|
||||
if(!vis[vec[index].at(i).first])
|
||||
{
|
||||
nextans=dfs(vec[index].at(i).first);
|
||||
ksum+=nextans;
|
||||
totalans+=(n-nextans)*nextans*vec[index].at(i).second;
|
||||
}
|
||||
}
|
||||
return 1+ksum;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d %d",&n,&m);
|
||||
/// ...
|
||||
if(n==0||m==0)
|
||||
{
|
||||
printf("0 0.00\n");
|
||||
continue;
|
||||
}
|
||||
for(int i=0;i<=n;i++)
|
||||
{
|
||||
father[i]=i;
|
||||
}
|
||||
for(int i=0;i<MAXN;i++)
|
||||
{
|
||||
vec[i].clear();
|
||||
}
|
||||
memset(vis,0,sizeof(vis));
|
||||
|
||||
for(int i=0;i<m;i++)
|
||||
{
|
||||
scanf("%d %d %d",&bus[i].u,&bus[i].v,&bus[i].w);
|
||||
}
|
||||
sort(bus,bus+m,cmp);
|
||||
|
||||
LL sum=0;
|
||||
|
||||
int ss=0;
|
||||
for(int cc=0;cc<m&&ss<n-1;cc++)
|
||||
{
|
||||
/// father[x]==x : x is standalone
|
||||
int fu=findfather(bus[cc].u);
|
||||
int fv=findfather(bus[cc].v);
|
||||
if(fu!=fv)
|
||||
{
|
||||
father[fu]=fv;
|
||||
++ss;
|
||||
sum+=bus[cc].w;
|
||||
vec[bus[cc].u].push_back(make_pair(bus[cc].v,bus[cc].w));
|
||||
vec[bus[cc].v].push_back(make_pair(bus[cc].u,bus[cc].w));
|
||||
}
|
||||
}
|
||||
|
||||
int b;
|
||||
for(b=1;b<=n;b++)
|
||||
/// FAQ: Why == 1 ? ANS: Because Nodes At the Edge of the graph has only 1 route.
|
||||
if(vec[b].size()==1) break;
|
||||
|
||||
totalans=0;
|
||||
dfs(b);
|
||||
|
||||
double tans=n*(n-1)/2.0;
|
||||
/// Use Long Long?
|
||||
printf("%I64d %.2lf\n",sum,(double)totalans/tans);
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user