题目连接:点击打开链接

解法:利用kruskal算法 把图划分成森林, 同一点有相同最小的权值到别的点, 通过determinant计算树的课数。

总结:模板 + 自己不太懂 = 记录 + 重新学

代码君:

#include <stdio.h>
#include <iostream>
#include <vector>#define LL long longusing namespace std;const int MAX = 105;
const int MAXE = 1005;struct node
{int set[MAX];void init(int n){for (int i = 0; i <= n; i++)set[i] = i;}int find(int x){if (set[x] != x)set[x] = find(set[x]);return set[x];}int Union(int x, int y){int xx = find(x);int yy = find(y);if (xx == yy)return -1;set[xx] = yy;return 1;}
};struct Node
{int u, v, dis;
};node a, b, c;
int n, m;
Node e[MAXE];
int visit[MAX];
vector<int> g[MAX];
LL p[MAX][MAX], MOD, deg[MAX][MAX];bool cmp(Node a, Node b)
{return a.dis < b.dis;
}LL DET(LL a[][MAX], int n)
{LL temp = 1, t;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)a[i][j] %= MOD;for (int i = 1; i < n; i++){for (int j = i + 1; j < n; j++)while (a[j][i]){t = a[i][i] / a[j][i];for (int k = i; k < n; k++){a[i][k] -= a[j][k] * t;a[i][k] %= MOD;}for (int k = i; k < n; k++){t = a[i][k];a[i][k] = a[j][k];a[j][k] = t;}temp = -temp;}temp = temp * a[i][i] % MOD;}return (temp + MOD) % MOD;
}LL cal_MST_cout()
{sort(e + 1, e + m + 1, cmp);int pre = e[1].dis;LL ans = 1;a.init(n);b.init(n);memset(visit, false, sizeof(visit));memset(deg, false, sizeof(deg));for (int i = 0; i <= n; i++)g[i].clear();for (int t = 1; t <= m + 1; t++){if (e[t].dis != pre || t == m + 1){for (int i = 1; i <= n; i++)if (visit[i]){int k = b.find(i);g[k].push_back(i);visit[i] = 0;}for (int i = 1; i <= n; i++)if (g[i].size()){memset(p, false, sizeof(p));for (int j = 0; j < g[i].size(); j++)for (int k = j + 1; k < g[i].size(); k++){int x = g[i][j];int y = g[i][k];p[j][k] = p[k][j] = -deg[x][y];p[j][j] += deg[x][y];p[k][k] += deg[x][y];}ans = ans * DET(p, g[i].size()) % MOD;for (int j = 0; j < g[i].size(); j++)a.set[g[i][j]] = i;}memset(deg, false, sizeof(deg));for (int i = 1; i <= n; i++){b.set[i] = a.find(i);g[i].clear();}if (t == m + 1)break;pre = e[t].dis;}int x = a.find(e[t].u);int y = a.find(e[t].v);if (x == y)continue;visit[x] = visit[y] = 1;b.Union(x, y);deg[x][y]++;deg[y][x]++;}if (!m)return false;for (int i = 2; i <= n; i++)if (b.find(i) != b.find(1))return false;return ans;
}int main()
{while (~scanf("%d%d%lld", &n, &m, &MOD) && (n | m | MOD)){for (int i = 1; i <= m; i++)scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].dis);printf("%lld\n", cal_MST_cout());}
}

hdu 4408 Minimum Spanning Tree相关推荐

  1. HDU 4408 Minimum Spanning Tree 最小生成树计数

    http://acm.hdu.edu.cn/showproblem.php?pid=4408 题意:求最小生成树个数 题解:对于Kruskal算法,我们发现,最小生成树要想用多种方法就要有长度相同的边 ...

  2. HDU 4408 - Minimum Spanning Tree(最小生成树计数)

    有边权的最小生成树计数 模板 #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostre ...

  3. Minimum spanning tree HDU - 6954

    Minimum spanning tree HDU - 6954 题意: 给定n-1个点,编号从2到n,两点a和b之间的边权重为lcm(a,b).请找出它们形成的最小生成树. 2<=n<= ...

  4. Directed Minimum Spanning Tree: Chu-Liu/Edmonds Algorithm

    我们的现代数据库大作业要求实现一个图查询系统,包括基于属性的子图查询.可达性查询(可选).最短路径查询(可选).TopK最短路径查询(可选).图形化展示(可选)等功能.分成子图同构查询小组以及可达性及 ...

  5. 《Boost》Part1 Minimum Spanning Tree

    <Boost>Part1 Minimum Spanning Tree 1.Boost中的最小生成树介绍 MST最小生成树,是图论中的基本算法,还有一种是最大生成树,此处暂不介绍. 最小生成 ...

  6. 第十三章 ALDS1_12_A:Minimum Spanning Tree 最小生成树

    知识点 树是没有环的图 在树中,任意顶点r和顶点v之间必然存在着1条路径 生成树:拥有图G的所有顶点,并且在保证自身是树的前提下拥有尽量多的边. 最小生成树(MST):个边权值总和最小的生成树 普里姆 ...

  7. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  8. 最小生成树(MST,minimum spanning tree)

    生成树:由图生成的树,由图转化为树,进一步可用对树的相关操作来对图进行操作.最小指的是权值最小: 生成树是边的集合,如下图所示的最小生成树:MST={{a,b},{a,f},{f,c}}\text{M ...

  9. 百度之星2018资格赛t6三原色图(MST minimum spanning tree)

    ac代码: #include<bits/stdc++.h> #define per(i,a,b) for(int i=a;i<=b;i++) using namespace std; ...

最新文章

  1. 求几亿个数中不重复元素的个数
  2. Angular 变化检测详解
  3. [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器...
  4. why SAP CRM object family error message is filtered out
  5. Android 自定义View消除锯齿实现图片旋转,添加边框及文字说明
  6. 重拾强化学习的核心概念_强化学习的核心概念
  7. C 控制父、子进程的先后顺序执行
  8. 没看过这10本程序员必读烧脑经典,别说你是敲代码的
  9. Protecting the Flowers(POJ-3262)
  10. MySQL 索引最左匹配原则的理解
  11. Linux 文件权限、目录权限
  12. WebSocket模拟群聊
  13. 360+城市空气质量指数-日度数据、良好天数统计(2001-2022年)
  14. 鼠标点击操作实际上如何传递到显示器?【全流程图解】
  15. maxima学习笔记(一)
  16. 2019产品数据管理(PDM)技术说明
  17. 软考-高项-论文-信息系统项目的质量管理
  18. Python实现占用栅格地图的生成(Occupancy Grid Generation)
  19. (ACWing yxc基础算法课笔记) 前缀和
  20. 淘宝心选在大润发开店了,背后意味着什么?

热门文章

  1. linux安装教程以及使用时遇到的问题和解决方法
  2. 埃斯顿机器人 王杰高_产教融合进行时——南京埃斯顿集团王杰高博士一行来我校开展合作交流...
  3. debian linux win7,win7debian双系统
  4. 谈谈自己对微信商城的看法
  5. 2021年“深育杯“网络安全大赛Writeup
  6. Mac OS X: MS Office 2008 Preference Manifests
  7. Tita 绩效管理:一对一正式面谈
  8. 吉尔布雷斯的动作研究——《可以量化…
  9. (转载)MatLab绘图
  10. ITU-T的Recommendation和IETF的RFC标准文档的下载地址