最小生成树会多样的情况是:两个或多个边等长且连通同样的两个并查集块。

所以可以跑一遍克鲁斯卡尔,每次把当前等长的边数出来,注意不要边找边并查,因为有一部分边是正常跑生成树我们也不会要他的,这种直接跳了;还有一些,是因为你选择了第一个边,然后并在一起了,这时扫到后面的边时他自然会被抛弃。而这种比较委屈的、因为先来后到而被抛弃的边的个数,正是本题答案。如果贪心地并查地话,无法区分这个是本来就跳的,还是我们要找的。

 const int maxn = 2e5 + ;
int n, m, f[maxn], ans;
struct Edge {
int u, v, cost; bool operator < (const Edge& rhs) const {
return cost < rhs.cost;
}
}e[maxn]; inline int getf(int v) { return v == f[v] ? v : f[v] = getf(f[v]); } int main() {
read(n), read(m);
rep(i, , n) f[i] = i;
rep(i, , m) {
read(e[i].u);
read(e[i].v);
read(e[i].cost);
}
sort(e + , e + + m);
for (int i = , j; i <= m; i = j) {
for (j = i; j <= m && e[j].cost == e[i].cost; j++);
int cnt = ;
rep(k, i, j - ) {
if (getf(e[k].u) != getf(e[k].v))
cnt++;
}
rep(k, i, j - ) {
if (getf(e[k].u) != getf(e[k].v)) {
f[getf(e[k].u)] = getf(e[k].v);
cnt--;
}
}
ans += cnt;
}
writeln(ans);
return ;
}

最新文章

  1. linq to entity常用操作
  2. ABP理论学习之Web API控制器(新增)
  3. JAVA初学(1):值类型和引用类型的区别
  4. MyKTV
  5. IOS第14天(2, Modal控制)
  6. Kinect帮助文档翻译之二 手势
  7. 分布式内存对象缓存 memcached
  8. shell脚本语法基础汇总
  9. Android Activity之间通信
  10. JAVA中Sql时间格式与util时间格式转换
  11. Vue中父组件传子组件
  12. vue-cil和webpack中本地静态图片的路径问题解决方案
  13. IIS 错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
  14. scala-协变和逆变
  15. NDK 开发实例一(Android.mk环境配置下)
  16. python3.6 使用pyinstaller 打包web程序的方法
  17. 【转】WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式
  18. [转载]时间显示插件 flipclock.js
  19. django 认证模块auth,表单组件form
  20. 使用qshell备份七牛云存储文件

热门文章

  1. appium-java-api
  2. 手游服务器php架构比较
  3. java -jar 与nohup的区别
  4. VC++ 对话框下使用工具栏
  5. js 原型继承和class继承
  6. 百度dureos CMake Error
  7. php与html 表单的结合
  8. FZU1901 Period II —— KMP next数组
  9. HDU 1257:最少拦截系统
  10. JAVA 单选样式编写