POJ1679(次小生成树)
The Unique MST
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 36692 | Accepted: 13368 |
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
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! 题解:
次小生成树,维护一个两点间的最小距离,最后再向上加
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
#define line cout<<"------------------"<<endl;
const int MAXN=1e4+10;
const int INF=0x3f3f3f3f;
int n,m;
struct node{
int x,y;
int v;
bool vis;
}Edge[MAXN];
bool cmp(node a,node b)
{
return a.v<b.v;
}
int pre[MAXN];
int Find(int a)
{
if(pre[a]==a)
return a;
return Find(pre[a]);
}
vector<int >G[110]; int maxd[110][110];//并查集划到一个树上后,树上任意两点之间的距离 void init()
{
for (int i = 1; i <=n; ++i) {
G[i].clear();
pre[i] = i;
G[i].push_back(i);
} }
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&Edge[i].x,&Edge[i].y,&Edge[i].v);
Edge[i].vis=false;
}
sort(Edge+1,Edge+1+m,cmp);
int sum=0;
for (int i = 1; i <=m ; ++i) {
int x=Find(Edge[i].x);
int y=Find(Edge[i].y);
if(x!=y)
{
pre[x]=y;
sum+=Edge[i].v;
int len1=G[x].size();
int len2=G[y].size();
for (int j = 0; j <len1 ; ++j) {
for (int k = 0; k <len2 ; ++k) {
maxd[G[x][j]][G[y][k]]=maxd[G[y][k]][G[x][j]]=Edge[i].v;//构建两点间最小距离
}
}
int tem[110];
for (int j = 0; j <len2 ; ++j) {
tem[j]=G[y][j];
}
for (int j = 0; j <len1 ; ++j) {
G[y].push_back(G[x][j]);
}
for (int j = 0; j <len2 ; ++j) {
G[x].push_back(tem[j]);
}
Edge[i].vis=true;
}
}
int cis=INF;
for (int i = 1; i <=m ; ++i) {//从不是最小生成树上的边,遍历向上加。找到次小生成树
if(!Edge[i].vis)
cis=min(cis,sum+Edge[i].v-maxd[Edge[i].x][Edge[i].y]);
}
if(cis>sum)
printf("%d\n",sum);
else
printf("Not Unique!\n");
} return 0;
}
//poj1679
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 次小生成树
prim方法:先求过一遍prim,同时标记使用过得边.然后同时记录任意2点间的最大值. 每次加入一条新的边,会产生环,删去环中的最大值即可. #include<stdio.h> #incl ...
- 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【次小生成树】
题意: 判断最小生成树是否唯一. 思路: 首先求出最小生成树,记录现在这个最小生成树上所有的边,然后通过取消其中一条边,找到这两点上其他的边形成一棵新的生成树,求其权值,通过枚举所有可能,通过这些权值 ...
- 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 ...
随机推荐
- 【Leetcode】【Easy】Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- Ant Design项目记录和CSS3的总结和Es6的基本总结
这里主要是介绍自己运用ANT框架的一些小总结,以前写到word里,现在要慢慢传上来, 辅助生殖项目总结:从每个组件的运用的方法和问题来总结项目. 1.项目介绍 辅助生殖项目主要运用的是Ant.desi ...
- 如何将一个PDF文件里的图片批量导出
假设我有下面这个PDF文件,里面有很多图片,我想把这些图片批量导出,而不是在Adobe Acrobat Reader里一张张手动拷贝: 本文介绍一种快捷做法. 用PDF-XChange Editor打 ...
- Android(java)学习笔记57:PC and Phone 通信程序
1. 首先我写的程序代码如下: package com.himi.udpsend; import java.net.DatagramPacket; import java.net.DatagramSo ...
- 编程思想的理解(POP,OOP,SOA,AOP) x
http://blog.chinaunix.net/uid-29417436-id-4060980.html 1)POP--面向过程编程(Process-oriented programming ): ...
- CSU计算机研究生推免
考研复习 一开始,我是没有想到能够拿到研究生推免资格的,从今年3月份到整个暑假过完,一共6个月的时间,我一直在准备考研. 具体来说,我是在准备考研数学,整整6个月时间的数学复习,给我一种感觉,把大一大 ...
- 2018_MCM_ICM_C
- vue案列
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- HDU 1099 Lottery (求数学期望)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1099 Lottery Time Limit: 2000/1000 MS (Java/Others) ...
- hbase 数据拷贝
由于运营数据太大,另外避免影响正常访问,所以需要临时拷贝部分数据到临时表中. bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable [--star ...