解题方法,,,首先应该可以看出来是一颗 最小生成树,任意一条的边的价值是不同的;所以计算出最小生成树的每一条边有多少对顶点满足他的 f 值就是这条边的 权值,因此可以在生成最小生成树的时候,进行一下统计,每加入一条边,就统计一下,得到 f 值和这条边权值相同有多少对顶点;方法是  记录一个 rank 数组,记录每个分支里面有多少个顶点,合并的时候,以为 是按照权值从小大大放入的,所以结果是 rank[a]*ran[b]*2;

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; struct date{
int
u,v,w;
bool
operator < ( const date &a )const{
return
a.w > w;
}
}
edge[];
int
N,M,Q;
int
f[];__int64 rank[];
int
find( int x ){
if
( x != f[x] )return f[x] = find( f[x] );
return
x;
}

int
res[]; __int64 num[];
int
search( int lt,int rt,int key )
{

if
( rt - lt < )
{

for
( int i = lt; i <= rt; i++ )
if
( res[i] >= key )return i;
return
rt+;
}

int
mid = ( lt + rt )>>;
if
( key > res[mid] )
return
search( mid,rt,key );
else return
search( lt,mid,key );
}

int
main( )
{

int
u,v,w;
while
( scanf("%d%d",&N,&M) != EOF )
{

for
( __int64 i =; i <= M; i++ ){
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
}
sort( &edge[],&edge[]+M );
for
( int i =; i <= N; i++ )f[i] = i;
for
( int i =; i <= N; i++ )rank[i] =;
int
k =;
for
( int i =; i <= M; i++ )
{

int
u = edge[i].u; int v = edge[i].v;
int
a = find( u ); int b = find( v );
if
( a != b )
{

res[++k] = edge[i].w;
num[k] = rank[a]*rank[b]*;
rank[b] += rank[a];
f[a] = b;
}
}

for
( int i = k-; i >=; i-- )
num[i] = num[i]+num[i+];
scanf("%d",&Q);
for
( int i =; i <= Q; i++ )
{

int
a; scanf("%d",&a);
int
pos = search(,k,a );
if
( pos > k )puts("0");
else
printf("%I64d\n",num[pos]);
}
}

return
;
}

最新文章

  1. C#捕获c++异常
  2. Unity粒子系统特性
  3. 用collectionview实现瀑布流-转
  4. MySQL安装常见问题(找不到文件,系统服务无法启动...)
  5. JS验证邮箱格式是否正确的代码
  6. cp 命令参数
  7. apache2.4配置虚拟主机
  8. 【转】Log4cpp 封装
  9. php Memcached
  10. FFMpeg首次使用
  11. Java关键字——native
  12. random 模块
  13. bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)
  14. python学习之----lxml库和HTML parser
  15. WinForm中遇到Label要显示的内容太长,自动换行
  16. shiro异常类型
  17. hdu 3864 素数分解
  18. 【yum】yum的使用
  19. 安装zoom
  20. Cheatsheet: 2017 07.01 ~ 07.31

热门文章

  1. Android Service学习
  2. Xcode 创建静态库和动态库
  3. mysql之select(一)
  4. 斐波那契数列公式算法-JS实现
  5. yarn介绍
  6. Girls: different perspectives to consider
  7. Android 核心分析 之七Service深入分析
  8. FreePascal经典资料
  9. URAL 1200 Horns and Hoofs 枚举
  10. SPOJ 416 Divisibility by 15 细节题