九度OJ 1249:次小生成树 (次小生成树)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:203
解决:56
- 题目描述:
-
最小生成树大家都已经很了解,次小生成树就是图中构成的树的权值和第二小的树,此值也可能等于最小生成树的权值和,你的任务就是设计一个算法计算图的最小生成树。
- 输入:
-
存在多组数据,第一行一个正整数t,表示有t组数据。
每组数据第一行有两个整数n和m(2<=n<=100),之后m行,每行三个正整数s,e,w,表示s到e的双向路的权值为w。
- 输出:
-
输出次小生成树的值,如果不存在输出-1。
- 样例输入:
-
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
- 样例输出:
-
4
6
思路:
求给定图的次小生成树。
对于给定的图,我们可以证明,次小生成树可以由最小生成树变换一边得到。那么我们可以如下求给定图的次小生成树。首先,我们用prime算法求出图的最小生成树,在这个过程中记录每条边是否用过,以及两个点之间最短路径上的最大权值F[i,j]
F[i,j]可以如此求得,当加入点u的时候,并且u的父结点是v 那么对于已经在生成树中的节点x
F[x,u] = max(F[x,v], weight[u][v]),那么我么就可以用Prime算法一样的时间复杂度来求出图的次小生成树。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define INF 0x3f3f3f3f int T, n, m;
int G[110][110], F[110], M[110][110], mark[110]; int max(int x, int y) {
return x > y ? x : y;
} void dfs(int src, int pre, int now) {
if (mark[now]) return;
//printf("dfs %d %d\n", src, now); if (src == now) {
M[src][now] = M[now][src] = 0;
}else {
M[src][now] = max(G[pre][now], M[src][pre]);
M[now][src] = M[src][now];
//printf("update M(%d,%d) = %d\n", now, src, M[src][now]);
} mark[now] = 1; int i;
for (i=1; i<=n; i++)
if (F[i] == now || F[now] == i) {
dfs(src, now, i);
}
} int main()
{
scanf("%d", &T); while (T--) {
scanf("%d%d", &n, &m); memset(G, INF, sizeof G);
int i, j;
for (i=0; i<m; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
G[a][b] = G[b][a] = c;
} // prim
int dist[110], min_sum=0;
memset(dist, INF, sizeof dist);
memset(F, -1, sizeof F);
memset(mark, 0, sizeof mark);
dist[1] = 0;
while (1) {
j = 0;
for (i=1; i<=n; i++)
if (!mark[i] && dist[i] < dist[j]) j = i; if (j == 0) break;
min_sum += dist[j];
mark[j] = 1; for (i=1; i<=n; i++)
if (!mark[i] && dist[i] > G[j][i]) {
dist[i] = G[j][i];
F[i] = j;
}
} // now we get the max_path of i to j
memset(M, 0, sizeof M);
for (i=1; i<=n; i++) {
memset(mark, 0, sizeof mark);
dfs(i, i, i);
} int ans = INF;
// try delete i-j
for (i=1; i<=n; i++)
for (j=1; j<=n; j++) {
if (i!=j && F[j] != i && F[i] != j && min_sum + G[i][j] - M[i][j] < ans) {
ans = min_sum + G[i][j] - M[i][j];
//printf("ans : min_sum + G[%d][%d] - M[%d][%d] = %d\n", i, j, i, j, ans);
}
} printf("%d\n", ans);
} return 0;
} /**************************************************************
Problem: 1249
User: warcraftw
Language: C
Result: Accepted
Time:20 ms
Memory:1008 kb
****************************************************************/
九度OJ 1249:次小生成树 (次小生成树)的更多相关文章
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ 1502 最大值最小化(JAVA)
题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...
- 九度OJ,题目1089:数字反转
题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...
- 九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
随机推荐
- 【转】docker安装PostgreSQL
原文:https://blog.csdn.net/liuyueyi1995/article/details/61204205 你先确认这两件事:1)执行 docker exec -it dream.p ...
- es创建索引的格式,并初始化数据
es创建索引的格式,并初始化数据 学习了:https://www.imooc.com/video/15759 1, 创建格式 POST 127.0.0.1:9200/book/novel/_mappi ...
- ionic准备之angular基础——模板引入(7)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
1.Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'. 原因解析: gradle ...
- linux程序设计——取消一个线程(第十二章)
12.7 取消一个线程 有时,想让一个线程能够要求还有一个线程终止,就像给它发送一个信号一样. 线程有方法能够做到这一点,与与信号处理一样.线程能够被要求终止时改变其行为. pthread_ca ...
- 【转】mongoDB命令行和客户端访问
一.客户端 mongodb客户端常用的是mongoVUE 下载mongoVUE:网上下载地址,并且是破解版.[若没分,可以单独找我].因为非破解版的只有15天的使用限制. 打开界面如 ...
- nginx日志统计流量
cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}' $10是nginx字段bytes_sent 字段,根据自己的日志格式修改 ...
- Caused by: java.lang.ClassNotFoundException: Didn't find class "** *** ** **" on path: DexPathList[[zip file "/data/app/*** *** ***-2/base.apk"],nativeLibraryDirectories
Caused by: java.lang.ClassNotFoundException: Didn't find class "** *** ** **" on path: Dex ...
- springBoot+springCloud学习笔记
尊重原创:https://www.jianshu.com/p/492dfefa2735 SpringBoot 配置优先级 在命令行中传入的参数 如:java -jar storeMs.jar --se ...
- awk.sed.grep三剑客详解
事前准备1.主机node1:172.16.133.112.作为实验的文件/etc/passwd /etc/fstab qinqin cp /etc/passwd . cp /etc/fstab . 一 ...