【poj1679】The Unique MST
【题目大意】
共T组数据,对于每组数据,给你一个n个点,m条边的图,设图的最小生成树为MST,次小生成树为ans,若MST=ans,输出Not Unique!,否则输出MST
【题解】
很明确,先求MST再求ans。
关于求次小生成树,我打算写一个总结,先留个坑。
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<cmath>
- #include<ctime>
- #include<algorithm>
- using namespace std;
- const int INF=~0u>>;//正无穷
- struct node{int x,y,v;}E[];
- struct Node{int y,next,v;}e[];
- int T,n,m,len,mst,ans(INF),Link[],f[],vis[],map[][],flag[][],dp[][];
- inline int read()
- {
- int x=,f=; char ch=getchar();
- while(!isdigit(ch)) {if(ch=='-') f=-; ch=getchar();}
- while(isdigit(ch)) {x=x*+ch-''; ch=getchar();}
- return x*f;
- }
- void insert(int x,int y,int v) {e[++len].next=Link[x];Link[x]=len;e[len].y=y;e[len].v=v;}
- int find(int x) {return f[x]==x?x:f[x]=find(f[x]);}
- bool cmp(node a,node b) {return a.v<b.v;}
- void Kruskal()
- {
- sort(E+,E+m+,cmp);
- for(int i=;i<=m;i++)
- {
- int x=find(E[i].x),y=find(E[i].y);
- if(x!=y)
- {
- f[x]=y;
- mst+=E[i].v;
- flag[E[i].x][E[i].y]=flag[E[i].y][E[i].x]=;
- }
- }
- for(int i=;i<=n;i++)
- for(int j=i+;j<=n;j++)
- if(flag[i][j]) {insert(i,j,map[i][j]); insert(j,i,map[j][i]);}
- }
- void dfs(int st,int x,int v)
- {
- vis[x]=;
- dp[st][x]=v;
- for(int i=Link[x];i;i=e[i].next)
- if(!vis[e[i].y]) dfs(st,e[i].y,max(dp[st][x],e[i].v));
- }
- void pre()
- {
- memset(Link,,sizeof(Link));
- memset(flag,,sizeof(flag));
- memset(dp,,sizeof(dp));
- len=mst=; ans=INF;
- for(int i=;i<=n;i++) f[i]=i;
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- map[i][j]=(i==j?:INF);
- }
- int main()
- {
- freopen("cin.in","r",stdin);
- freopen("cout.out","w",stdout);
- T=read();
- while(T--)
- {
- n=read(); m=read();
- pre();
- for(int i=;i<=m;i++)
- {
- int x=read(),y=read(),v=read();
- map[x][y]=map[y][x]=v;
- E[i].x=x; E[i].y=y; E[i].v=v;
- }
- Kruskal();
- for(int i=;i<=n;i++) {memset(vis,,sizeof(vis)); dfs(i,i,);}
- for(int i=;i<=n;i++)
- for(int j=i+;j<=n;j++)
- if(!flag[i][j]&&map[i][j]!=INF) ans=min(ans,mst+map[i][j]-dp[i][j]);
- if(ans==mst) printf("Not Unique!\n");
- else printf("%d\n",mst);
- }
- return ;
- }
【poj1679】The Unique MST的更多相关文章
- 【题解】 AT2134 Zigzag MST
[题解]AT2134 Zigzag MST 一道MST好题 \(Anson\)有云: 要么是减少边的数量. 要么是改变连接边的方式. 那么如何减少边的数量呢?很简单,把所有不可能对答案产生贡献的边去掉 ...
- 【LeetCode】95. Unique Binary Search Trees II 解题报告(Python)
[LeetCode]95. Unique Binary Search Trees II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzh ...
- 【POJ 1679】 The Unique MST
[题目链接] 点击打开链接 [算法] 先求出图的最小生成树 枚举不在最小生成树上的边,若加入这条边,则形成了一个环,如果在环上且在最小生成树上的权值最大的边等于 这条边的权值,那么,显然最小生成树不唯 ...
- 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树
这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...
- POJ1679:The Unique MST(最小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 38430 Accepted: 14045 ...
- 【POJ 1679 The Unique MST】最小生成树
无向连通图(无重边),判断最小生成树是否唯一,若唯一求边权和. 分析生成树的生成过程,只有一个圈内出现权值相同的边才会出现权值和相等但“异构”的生成树.(并不一定是最小生成树) 分析贪心策略求最小生成 ...
- 【POJ 1679】The Unique MST(次小生成树)
找出最小生成树,同时用Max[i][j]记录i到j的唯一路径上最大边权.然后用不在最小生成树里的边i-j来替换,看看是否差值为0. #include <algorithm> #includ ...
- 【LeetCode】95. Unique Binary Search Trees II
Unique Binary Search Trees II Given n, generate all structurally unique BST's (binary search trees) ...
- 【LeetCode】96 - Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
随机推荐
- Win7系统64位环境下使用Apache——下载mod_jk
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/70313329 本文出自[我是干勾鱼的博客] 之前在几篇文章: Win7系统64位 ...
- F. Coprime Subsequences
题目链接: F. Coprime Subsequences time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- HashMap(HashSet)的实现
0. HashMap(TreeMAP).HashSet.HashTable 的关系 HashMap 的底层则维护着 Node<K, V>[] table; 一个一维数组用于快速访问(只在初 ...
- 老师木发的makefile与autotools
makefile http://scc.qibebt.cas.cn/docs/linux/base/%B8%FA%CE%D2%D2%BB%C6%F0%D0%B4Makefile-%B3%C2%F0%A ...
- 在zxing开源项目里,camera.setDisplayOrientation(90)出现错误
[错误提示] setDisplayOrientation(int)未定义 [错误原因] sdk版本过低,这个方法在Android2.2之后才有 [解决方法] 直接在project.propert ...
- C#编程的几个建议
1.属性(properties) 抽象属性可以放在接口的定义里.如: public interface INameValuePair<T> { string Nam ...
- SQL中遇到多条相同内容只取一条的实现
例如出现BID为1673的两条重复数据,要第一条 select * from(select no=row_number() over(partition by Bid order by getdate ...
- 【BZOJ2850】巧克力王国 KDtree
[BZOJ2850]巧克力王国 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜 欢过于甜的巧克力.对于每一块巧克力,我们设 ...
- sql server中类似oracle中decode功能的函数
sqlserver 2008 写法 select t.PROJECTNAME, t.BUILDCONTENTSCALE, CASE t.PROJECTLEVEL ' THEN '国家重点' ' THE ...
- 关于urlDecode和tomcat一些源码
1. 看下面源码,找到%号,每次加2,然后将16进制转换为int,也就是%号后两位加2得到16进制,转换为int ) < numChars) && (c=='%')) { ,i+ ...