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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.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
Druid连接池实现自定义场景的多数据库的连接
2019-04-27
CentOs7命令行(静默)的方式安装oracle数据库
2019-04-27
基于VMware安装CentOs7的镜像
2019-04-27