POJ - 1679 The Uinque MST
发布日期:2022-02-17 09:51:12 浏览次数:8 分类:技术文章

本文共 3379 字,大约阅读时间需要 11 分钟。

POJ - 1679 The Uinque MST

题意

问给定的图是否有唯一的最小生成树

思路

  • 次小生成树

  • 利用Prim算法求最小生成树,选择最小的边时进行判断:

    * 是否有两个或者以上的未选择顶点到已选顶点集合的权值相等,若有则不唯一。 * 在松弛操作计算的时候也要判断刚加进去的顶点的权值是否相等。

代码

  • 次小生成树
#include 
#include
#include
#include
using namespace std;/* * 次小生成树 * 求最小生成树时,用数组Max[i][j]来表示MST中i到j最大边权 * 求完后,直接枚举所有不在MST中的边,替换掉最大边权的边,更新答案 * 点的编号从0开始 */const int MAXN = 110;const int INF = 0x3f3f3f3f;bool vis[MAXN];int lowc[MAXN];int pre[MAXN];int Max[MAXN][MAXN]; //Max[i][j]表示在最小生成树中从i到j的路径中的最大边权bool used[MAXN][MAXN];int Prim(int cost[][MAXN], int n){
int ans = 0; memset(vis, false, sizeof(vis)); memset(Max, 0, sizeof(Max)); memset(used, false, sizeof(used)); vis[0] = true; pre[0] = -1; for (int i = 1; i < n; i++) {
lowc[i] = cost[0][i]; pre[i] = 0; } lowc[0] = 0; for (int i = 1; i < n; i++) {
int minc = INF; int p = -1; for (int j = 0; j < n; j++) if (!vis[j] && minc > lowc[j]) {
minc = lowc[j]; p = j; } if (minc == INF) return -1; ans += minc; vis[p] = true; used[p][pre[p]] = used[pre[p]][p] = true; for (int j = 0; j < n; j++) {
if (vis[j]) Max[j][p] = Max[p][j] = max(Max[j][pre[p]], lowc[p]); if (!vis[j] && lowc[j] > cost[p][j]) {
lowc[j] = cost[p][j]; pre[j] = p; } } } return ans;}int ans;int smst(int cost[][MAXN], int n){
int Min = INF; for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) if (cost[i][j] != INF && !used[i][j]) {
Min = min(Min, ans + cost[i][j] - Max[i][j]); } if (Min == INF) return -1; //不存在 return Min;}int cost[MAXN][MAXN];int main(){
int T; int n, m; scanf("%d", &T); while (T--) {
scanf("%d%d", &n, &m); int u, v, w; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) {
if (i == j) cost[i][j] = 0; else cost[i][j] = INF; } while (m--) {
scanf("%d%d%d", &u, &v, &w); u--; v--; cost[u][v] = cost[v][u] = w; } ans = Prim(cost, n); if (ans == -1) {
printf("Not Unique!\n"); continue; } if (ans == smst(cost, n)) printf("Not Unique!\n"); else printf("%d\n", ans); } return 0;}
  • Prim
#include 
#include
#include
#include
using namespace std;#define INF INT_MAX-100 int map[105][105],dis[105];int m,n;bool visit[105]; int Prime() {
int j,k; int temp,ans=0; for (int i=1;i<=n;i++) dis[i]=map[1][i]; visit[1]=true; for (int i=1;i
map[k][j]) dis[j]=map[k][j]; else if (dis[j]==map[k][j] && dis[j]!=INF) return -1; } return ans; } void init(){
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) map[i][j]=INF; for (int i=1;i<=n;i++) map[i][i]=0; memset(visit,false,sizeof(visit));} int main (){
int T; scanf("%d",&T); while (T--) {
int x,y,w; scanf("%d%d",&n,&m); init (); for (int i=0;i

转载地址:https://blog.csdn.net/qq_43826794/article/details/102786280 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Codeforces Round #594 (Div. 2) B. Grow The Tree
下一篇:HDU 1498

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月13日 06时58分29秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

spring boot 与 Ant Design of Vue 实现修改按钮(十七) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除按钮(十八) 2019-04-27
spring boot 与 Ant Design of Vue 实现角色管理布局以及角色的列表(十九) 2019-04-27
spring boot 与 Ant Design of Vue 实现新增角色(二十) 2019-04-27
spring boot 与 Ant Design of Vue 实现修改角色(二十一) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除角色(补二十一) 2019-04-27
spring boot 与 Ant Design of Vue 实现组织管理布局的实现(二十二) 2019-04-27
spring boot 与 Ant Design of Vue 实现左侧组织树(二十三) 2019-04-27
spring boot 与 Ant Design of Vue 实现新增组织(二十四) 2019-04-27
spring boot 与 Ant Design of Vue 实现修改组织(二十五) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除组织(二十六) 2019-04-27
spring boot 与 Ant Design of Vue 实现获取用户列表(二十七) 2019-04-27
spring boot 与 Ant Design of Vue 实现新增用户(二十八) 2019-04-27
spring boot 与 Ant Design of Vue 实现修改用户(二十九) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除用户(三十) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系登录的实现(三十一) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系获取用户信息的实现(三十二) 2019-04-27
Druid连接池实现自定义场景的多数据库的连接 2019-04-27
CentOs7命令行(静默)的方式安装oracle数据库 2019-04-27
基于VMware安装CentOs7的镜像 2019-04-27