POJ1679 The Unique MST 【次小生成树】
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 20421 | Accepted: 7183 |
Description
Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of G, say T = (V', E'), with the following properties:
1. V' = V.
2. T is connected and acyclic.
Definition 2 (Minimum Spanning Tree): Consider an edge-weighted, connected, undirected graph G = (V, E). The minimum spanning tree T = (V, E') of G is the spanning tree that has the smallest total cost. The total cost of T means the sum of the weights on all
the edges in E'.
Input
triple (xi, yi, wi), indicating that xi and yi are connected by an edge with weight = wi. For any two nodes, there is at most one edge connecting them.
Output
Sample Input
2
3 3
1 2 1
2 3 2
3 1 3
4 4
1 2 2
2 3 2
3 4 2
4 1 2
Sample Output
3
Not Unique!
Source
这题做得好开心,一次AC~
题意:给定一个联通图,推断最小生成树是否唯一。
题解:求出最小生成树后再求次小生成树。若次小生成树的长度与最小生成树相等就说明不唯一,否则唯一。
这是我的第一道次小生成树题,在这里总结下这个算法:
利用一个矩阵max【】【】表示最小生成树中随意两点路径上的最长边权值(关键!!),在求最小生成树时将已经选上的边标记为已用,求完后。遍历剩下未用的边,这条边若加入到最小树中必然构成回路。所以此时须要去掉原来树中那条回路中的最大值。也就是max矩阵存储的值。所以问题转换成找到一条未用的边,使得它跟相应于max矩阵里的边差值最小。遍历之后,次小生成树的值即为原最小生成树的值加上这个最小的差值。
#include <stdio.h>
#include <string.h>
#include <limits.h>
#define maxn 102
#define maxm (maxn * maxn) >> 1 int head[maxn], max[maxn][maxn];
struct Node{
int u, v, cost, next;
bool vis;
} E[maxm];
bool vis[maxn]; int mini(int a, int b){
return a < b ? a : b;
} int prim(int n, int m)
{
int u, i, tmp, j, len = 0, count = 0;
memset(max, 0x7f, sizeof(max));
memset(vis, 0, sizeof(vis));
vis[1] = 1;
while(count < n - 1){
for(i = 1, tmp = INT_MAX; i <= n; ++i){
if(!vis[i]) continue;
for(j = head[i]; j != -1; j = E[j].next){
if(vis[E[j].v]) continue;
if(E[j].cost < tmp){
tmp = E[j].cost; u = j;
}
}
}
++count; len += tmp;
for(i = 1; i <= n; ++i){
if(!vis[i]) continue;
max[i][E[u].v] = max[E[u].v][i] = E[u].cost;
}
vis[E[u].v] = 1; E[u].vis = 1;
}
return len;
} int getSecLen(int n, int m)
{
int min = INT_MAX, u, v, w;
for(int i = 0; i < m; ++i){
if(E[i].vis) continue;
u = E[i].u; v = E[i].v;
w = E[i].cost;
min = mini(min, w - max[u][v]);
if(min == 0) return 0;
}
return min;
} int main()
{
int t, n, m, i, minLen, secLen;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &m);
memset(head, -1, sizeof(head));
for(i = 0; i < m; ++i){
scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].cost);
E[i].vis = 0; E[i].next = head[E[i].u];
head[E[i].u] = i;
}
minLen = prim(n, m);
secLen = getSecLen(n, m);
if(secLen == 0) printf("Not Unique!\n");
else printf("%d\n", minLen);
}
return 0;
}
POJ1679 The Unique MST 【次小生成树】的更多相关文章
- POJ1679 The Unique MST[次小生成树]
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28673 Accepted: 10239 ...
- POJ1679 The Unique MST —— 次小生成树
题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total S ...
- POJ-1679 The Unique MST,次小生成树模板题
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Description Given a connected undirec ...
- POJ 1679 The Unique MST (次小生成树 判断最小生成树是否唯一)
题目链接 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. De ...
- POJ_1679_The Unique MST(次小生成树)
Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...
- POJ_1679_The Unique MST(次小生成树模板)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23942 Accepted: 8492 D ...
- POJ 1679 The Unique MST (次小生成树)
题目链接:http://poj.org/problem?id=1679 有t组数据,给你n个点,m条边,求是否存在相同权值的最小生成树(次小生成树的权值大小等于最小生成树). 先求出最小生成树的大小, ...
- poj1679The Unique MST(次小生成树模板)
次小生成树模板,别忘了判定不存在最小生成树的情况 #include <iostream> #include <cstdio> #include <cstring> ...
- POJ 1679 The Unique MST (次小生成树kruskal算法)
The Unique MST 时间限制: 10 Sec 内存限制: 128 MB提交: 25 解决: 10[提交][状态][讨论版] 题目描述 Given a connected undirect ...
- poj 1679 The Unique MST (次小生成树(sec_mst)【kruskal】)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35999 Accepted: 13145 ...
随机推荐
- PostgreSQL高可用集群方案收集/主从切换/一主多从(待实践)
对于业内来说,基本都在围绕主从切换的高可用方案: http://www.10tiao.com/html/175/201509/210974337/1.html https://www.jianshu. ...
- python+Django+apache的配置
下载安装xampp套件 下载mod_python-3.3.1.win32-py2.5-Apache2.2.exe 下载python-2.5.4.msi 下载Django 下载MySQL-python- ...
- eclipse3.4配置的tomcat server如何部署以前的web项目?
1. 打开.project文件,在<natures>元素中加入 <nature>org.eclipse.wst.common.project.facet.core.nature ...
- NFS CIFS SAMBA 的联系和区别
Common Internet File System, CIFS Server Message Block, SMB Network File System, NFS 在早期网络世界当中,档案数据在 ...
- ldap服务器OpenLDAP安装使用
OpenLDAP 是 LDAP 协议的一个开源实现.LDAP 服务器本质上是一个为只读访问而优化的非关系型数据库.它主要用做地址簿查询(如 email 客户端)或对各种服务访问做后台认证以及用户数据权 ...
- MySQL 用户管理及权限管理
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...
- 用java在客户端读取mongodb中的数据并发送至服务器
使用Java自带的socket端口来实现,程序如下: Client.java package com.cn.gao; import java.net.*; import java.io.*; impo ...
- 我也用github(2)——关联本地工程到github仓库
github只是为我们提供了一个存储的功能,我们也可以准备一个服务器(当然,能联网是前提了),将版本库保存到服务器上. 本文以github为例进行实验. 1. 在github上创建一个仓库 这个非常简 ...
- DeDeCMS(织梦)变量覆盖0day getshell
测试方法: @Sebug.net dis本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! #!usr/bin/php -w <?php error_reporting( ...
- Linux监听进程是否存在,并加入定时任务
前言 我们在linux主机上可能需要一直运行某一服务,如果关机后或者误杀,使得服务停止,从而影响日常的任务.比如一BI项目数据库的抽取,使用Taskctl调度,在每天固定时间进行数据的抽取,如果主机上 ...