poj1679 次小生成树
prim方法:先求过一遍prim,同时标记使用过得边。然后同时记录任意2点间的最大值。
每次加入一条新的边,会产生环,删去环中的最大值即可。
#include<stdio.h>
#include<string.h>
#define INF 99999999
const int maxn = ;
int map[maxn][maxn],vis[maxn],dis[maxn],n,pre[maxn],m,used[maxn][maxn];
int maxd[maxn][maxn];
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
void init()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(i==j)map[i][j]=;
else map[i][j]=INF;
}
}
}
int prim()
{
int ans=;
int i,j,pos;
memset(maxd,,sizeof(maxd));
for(i=;i<=n;i++)
{
dis[i]=map[][i];
vis[i]=;
pre[i]=;
}
vis[]=;
pre[]=-;
for(i=;i<n;i++)
{
int minc=INF;
for(j=;j<=n;j++)
{
if(!vis[j]&&minc>dis[j])
{
pos=j;
minc=dis[j];
}
}
vis[pos]=;
ans+=minc;
used[pre[pos]][pos]=used[pos][pre[pos]]=;
for(j=;j<=n;j++)
{
if(vis[j])
maxd[pos][j]=maxd[j][pos]=max(maxd[j][pre[pos]],dis[pos]);
}
for(j=;j<=n;j++)
{
if(!vis[j]&&dis[j]>map[pos][j])
{
dis[j]=map[pos][j];
pre[j]=pos;
}
}
}
return ans;
}
int dfs(int x)
{
int ans=INF;
int i,j;
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
if(i==j)continue;
if(map[i][j]!=INF&&!used[i][j])
{
ans=min(ans,x+map[i][j]-maxd[i][j]);
}
}
}
return ans;
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
for(i=;i<m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(map[x][y]>z)
map[x][y]=map[y][x]=z;
} memset(used,,sizeof(used));
int mst=prim();
int second_mst=dfs(mst);
if(second_mst!=mst)
printf("%d\n",mst);
else printf("Not Unique!\n");
}
}
poj1679 次小生成树的更多相关文章
- POJ1679(次小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24201 Accepted: 8596 D ...
- poj1679次小生成树入门题
次小生成树求法:例如求最小生成树用到了 1.2.4这三条边,总共5条边,那循环3次的时候,每次分别不用1.2.4求得最小生成树的MST,最小的MST即为次小生成树 如下代码maxx即求最小生成树时求得 ...
- POJ1679 The Unique MST[次小生成树]
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28673 Accepted: 10239 ...
- 次小生成树(POJ1679/CDOJ1959)
POJ1679 首先求出最小生成树,记录权值之和为MinST.然后枚举添加边(u,v),加上后必形成一个环,找到环上非(u,v)边的权值最大的边,把它删除,计算当前生成树的权值之和,取所有枚举加边后生 ...
- POJ1679(次小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36692 Accepted: 13368 ...
- POJ1679 The Unique MST【次小生成树】
题意: 判断最小生成树是否唯一. 思路: 首先求出最小生成树,记录现在这个最小生成树上所有的边,然后通过取消其中一条边,找到这两点上其他的边形成一棵新的生成树,求其权值,通过枚举所有可能,通过这些权值 ...
- POJ1679 The Unique MST 【次小生成树】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20421 Accepted: 7183 D ...
- 次小生成树(poj1679)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20737 Accepted: 7281 D ...
- POJ1679 The Unique MST —— 次小生成树
题目链接:http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total S ...
随机推荐
- div中的内容垂直居中的五种方法
一.行高(line-height)法 如果要垂直居中的只有一行或几个文字,那它的制作最为简单,只要让文字的行高和容器的高度相同即可,比如: p { height:30px; line-height:3 ...
- HDU 4777 Rabbit Kingdom --容斥原理+树状数组
题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个. 解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了 ...
- android studio没有org.apache.http.client.HttpClient;等包问题 解决方案
以前用Eclipse做Android开发工具一直使用apache的http做网络请求,最近换用了Android studio发现没有办法引用apache的包,下面是我引用的步骤
- 第24章 SEH结构化异常处理_异常处理及软件异常
24.1 程序的结构 (1)try/except框架 __try{ //被保护的代码块 …… } __except(except fileter/*异常过滤程序*/){ //异常处理程序 } (2) ...
- C++基础笔记(四)C++内存管理
析构函数 * 析构函数在对象所占用内存释放时调用,通常用来释放相关的资源 * 析构函数就是一个特殊的类成员函数,它是构造函数相反 构造函数:对象在分配内存之后,立即调用 析构函数:对象在内存被释放之前 ...
- Unity开发之NGUI系列
Unity插件收集 在Unity开发过程中会收集一些插件,收集这些插件的目的并不是我喜欢在开发中使用插件,而是本着喜欢的态度去收集的,就像我喜欢收集模型一样: 还有一点就是通过了解插件能让我知道Uni ...
- 迷你DVD管理器项目
package chapter5; import java.util.*; public class MiniDVD { public static void main(String[] args){ ...
- Saltstack-初体验
安装 rpm -Uvh http://mirrors.yun-idc.com/epel/6Server/x86_64/epel-release-6-8.noarch.rpm yum install s ...
- MySQL 约束的讲解
MySQL 约束 作用:保证数据的完整性和一致性按照约束的作用范围分为:表级约束和行级约束.常见的约束类型包括: Not null(非空约束) Primary key (主键约束) Unique ke ...
- 工作流模式与K2实现- (1)
背景 工作流产品众多,而它们之间又缺乏统一的标准,使得不同的产品之间很难实现协同工作.为了解决这一问题,工作流管理联盟(WFMC)于1993 年成立,并提出了工作流参考模型,制定了五个标准接口. 其中 ...