10.05-10.11

//本周依旧做一下图算法的题目,尽量少用algorithm里的函数,自己写熟悉熟悉。

1.The Unique MST

解析:该题为次小生成树问题。

次小生成树的求解过程:

1、找到最小生成树,值为mst

2、最小生成树种的点:找到每一个点到其它点的路径上的最大边权值 dp[i][j]表示i到j路径上的最大边权值

3、加一条不在最小生成树上的边。比如i - k,同时删除在最小生成树上i -> k路径上最大的一个边权值dp[i][k]; 这样会得到 new_mst,在这些new_mst中找一个最小的,就是次小生成树的值

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <algorithm>
  5 #include <string>
  6 #include <cstring>
  7
  8 using namespace std;
  9
 10 #define INF 1000000007
 11 #define MAXN 105
 12 #define MAX(a, b) (a > b ? a : b)
 13 #define MIN(a, b) (a < b ? a : b)
 14
 15 struct Edge
 16 {
 17     int v;
 18     int next;
 19 }edge[100010];
 20
 21 int t, n, m, T;
 22 int d[MAXN], vis[MAXN], pre[MAXN], head[MAXN];
 23 int g[MAXN][MAXN], dp[MAXN][MAXN], in_mst[MAXN][MAXN];
 24
 25 void init()
 26 {
 27     t = 0;
 28     for (int i = 0; i <= n; ++i)
 29         for (int j = 0; j <= n; ++j)
 30             g[i][j] = (i == j ? 0 : INF);
 31     memset(head, -1, sizeof(head));
 32     memset(in_mst, 0, sizeof(in_mst));
 33     memset(dp, 0, sizeof(dp));
 34 }
 35
 36 void addEdge(int u, int v)
 37 {
 38     edge[t].v = v;
 39     edge[t].next = head[u];
 40     head[u] = t++;
 41 }
 42
 43 int prim()
 44 {
 45     int ans = 0;
 46
 47     for (int i = 1; i <= n; ++i)
 48         d[i] = INF, pre[i] = 0, vis[i] = 0;
 49     pre[1] = 0, d[1] = 0;
 50     for (int i = 1; i <= n; ++i)
 51     {
 52         int min_cost = INF, idx = 0;
 53         for (int j = 1; j <= n; ++j)
 54             if (!vis[j] && min_cost > d[j])
 55                 min_cost = d[idx = j];
 56         vis[idx] = 1;
 57         ans += min_cost;
 58         for (int j = 1; j <= n; ++j)
 59             if (!vis[j] && d[j] > g[idx][j])
 60                 d[j] = g[idx][j], pre[j] = idx;
 61     }
 62     for (int i = 1; i <= n; ++i)
 63         if (pre[i]) in_mst[pre[i]][i] = in_mst[i][pre[i]] = 1;
 64     for (int i = 1; i <= n; ++i)
 65         if (pre[i])
 66             addEdge(pre[i], i), addEdge(i, pre[i]);
 67
 68     return ans;
 69 }
 70
 71 void dfs(int u, int v, int w)
 72 {
 73     vis[v] = 1;
 74     dp[u][v] = w;
 75     for (int e = head[v]; e != -1; e = edge[e].next)
 76         if (!vis[edge[e].v])
 77             dfs(u, edge[e].v, max(w, g[v][edge[e].v]));
 78 }
 79
 80 int main()
 81 {
 82     scanf("%d", &T);
 83     while (T--)
 84     {
 85         scanf("%d%d", &n, &m);
 86         init();
 87         int u, v, w;
 88         while (m--)
 89         {
 90             scanf("%d%d%d", &u, &v, &w);
 91             g[u][v] = g[v][u] = w;
 92         }
 93         int mst = prim();
 94         int ans = INF;
 95         for (int i = 1; i <= n; ++i)
 96         {
 97             memset(vis, 0, sizeof(vis));
 98             dfs(i, i, 0);
 99         }
100         for (int i = 1; i <= n; ++i)
101             for (int j = i+1; j <= n; ++j)
102                 if (!in_mst[i][j] && g[i][j] != INF)
103                     ans = min(ans, mst-dp[i][j]+g[i][j]);
104         if (ans == mst) puts("Not Unique!");
105         else printf("%d\n", mst);
106     }
107
108     return 0;
109 }

时间: 2024-10-06 08:14:43

10.05-10.11的相关文章

湖南多校对抗赛(2015.05.10)(国防科大学校赛决赛-Semilive)CSU1609-1618

简单地写个题解,毕竟总个结很重要.但是由于题目水 + 不会写题解,路过的大牛莫喷... 题A 题意:给你两个序列a和b,有一种操作,对于一个数(非头尾)v,左边加上v,右边加上v,自己变成-v,然后问a操作无数次可不可以变成b? 题解:这题我学会了一个分析题目的方法:从目标逆着推.对于两个一样的序列,如下 操作前:……(i - 1) (i) (i + 1) …… 操作后:……(i - 1) + (i) (i) - (i) - (i) (i + 1) + (i)…… 定义si为前i项的和,假设原序

C++开发者都应该使用的10个C++11特性

本文由 伯乐在线 - 治不好你我就不是兽医 翻译自 Marius Bancila.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. [感谢冯上(@治不好你我就不是兽医 )的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备.你也许看到过许多类似介绍各种C++11特性的文章.下面是我总结的,C++开发者都需要学习和使用的C++11

&lt;2014 05 10&gt; Android平台开发攻略

1.标准SDK开发: IDE: Eclipse Netbeans Language: Java 2.标准NDK+SDK开发: IDE: Eclipse Language: Java(JNI) C/C++ 3.Tranditional linux开发 IDE: c4droid,   command line.vim,emacs Language: C/C++ ------------------------------------------------------------ In a mini

3.26日第六次作业,第10章质量,11章人力

3.26日 第六次作业,第10章质量,11章人力 1.质量管理基本原则   以实用为核心的多元要求.系统工程.职工参与管理.管理层和第一把手重视.保护消费者权益.面向国际市场. 2.质量管理的目标顾客满意度.预防胜于检查.各阶段内的过程.   质量管理既重视结果也重视过程   实施组织主动采纳的质量改进措施(如全面质量管理.持续改进等) 3.质量管理的主要活动有哪些项目的质量管理可以分解为质量策划.质量保证与质量控制三个过程.质量策划是指确定与项目相关的质量标准,并决定如何达到这些质量标准.质量

通过数组方式向Oracle大批量插入数据(10万条11秒)

1.创建数据库Person CREATE TABLE Person( id number, name nvarchar2(200) , age number , sex nvarchar2(200) , password nvarchar2(200) ) 2.在数据库建立一个type,对应JAVA端要传入的对象结构: CREATE OR REPLACE TYPE BUT_UKBNOV_CTC_ORDER_REC1 AS OBJECT ( id number, name nvarchar2(200

C++开发者都应该使用的10个C++11特性 转

http://blog.jobbole.com/44015/2013/07/26 | 分类: C/C++, 开发 | 5 条评论 | 标签: C++11, C语言 分享到: 127 本文由 伯乐在线 - 治不好你我就不是兽医 翻译自 Marius Bancila.未经许可,禁止转载! 欢迎加入:技术翻译小组,或分享原创到伯乐头条. [感谢冯上(@治不好你我就不是兽医 )的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] 在C++11新标准中,语言本身和标准库都增加了很多新内

2014年10月31~11月1日,杨学明老师《新产品开发流程优化和项目管理》内训课程在中山某企业成功举办!

2014年10月31~11月1日,著名研发管理和产品创新专家杨学明老师在中山市某企业成功举办为期两天的<新产品开发流程优化和项目管理>内训,此次培训之前杨老师与企业研发老总和副总进行了深入的交流,就内训需求通过电话会议的方式进行了深入的访谈,准确把握到该企业在项目管理过程中遇到的各种问题,并针对该企业的行业特点设置了多个案例,在培训之中进行了深入的研讨,一共65人参加了培训,包括总经理,副总和中层干部.两天的培训,不但学习了项目管理的知识,更重要的是改变了大家的思维模式,学到了从原来的职能化运

下面程序的输出结果是____ A:11,10 B:11,11 C:10,10 D:10,11 int x=10; int y=x++; printf(&quot;%d,%d&quot;,(x++,y),y++);

下面程序的输出结果是____ A:11,10 B:11,11 C:10,10 D:10,11 int x=10; int y=x++; printf("%d,%d",(x++,y),y++); 输出结果为A  (y++优先级比较高,所以先计算y++,再计算()里面的内容) 原文地址:https://www.cnblogs.com/dyb-tsyyl/p/10108933.html

mysql int(10)和int(11)区别

先说结论,对于存储和计算来说,int(10)和int(11)没有区别,10代表数字长度,但是int类型占用4个字节,取值范围是-2147483648~2147483647,也就是最大长度是10,如果写成int(11), 插入11位数的时候是插入不进去的,mysql会默认int最大10位(2147483647),2147483648也将插入不了.所以int(1)和int(20)是没有区别的,但是写int(20)会认为对mysql字段类型理解不到位.但是TINYINT和INT区别就大了,TINYIN

八周二次课(1月30日) 10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync通过ssh同步

八周二次课(1月30日)10.28 rsync工具介绍10.29/10.30 rsync常用选项10.31 rsync通过ssh同步===================================================================================================================================================================rsync命令:是一个远程数据同步工具,可