次小生成树模板(poj1679)
prim
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
#define Min(x,y) (x<y?x:y)
#define Max(x,y) (x>y?x:y)
using namespace std;
#define gamma 0.5772156649015328606065120 //欧拉常数
#define MOD 100000007
#define inf 0x3f3f3f3f
#define N 205
#define maxn 10001000
typedef long long LL;
typedef pair<int,int> PII; int vis[],d[],pic[][],used[][],path[][];
int ans,n,pre[]; int prim()
{
for(int i=; i<=n; ++i) pre[i]=;
mst(vis,);
vis[]=;
int res=;
int i,j;
for(i=; i<=n; ++i) d[i]=pic[][i];
for(i=; i<n; ++i)
{
int m=inf,u;
for(j=; j<=n; ++j)
if(!vis[j]&&d[j]<m)
m=d[u=j];
res+=m;
vis[u]=;
used[u][pre[u]]=used[pre[u]][u]=;
for(j=; j<=n; ++j)
if(!vis[j]&&pic[u][j]<d[j])
{d[j]=pic[u][j];pre[j]=u;}
else if(vis[j]&&j!=u)
path[j][u]=path[u][j]=Max(m,path[j][pre[u]]);
}
int temp=inf;
for(int i=; i<=n; ++i)
for(int j=i+; j<=n; ++j)
{
if(!used[i][j])
temp=Min(temp,res+pic[i][j]-path[i][j]);
}
if(temp==res) return ;
ans=res;
return ;
} int main()
{
//freopen("in.txt","r",stdin);
int i,j,x,y,v,group,m;
scanf("%d",&group);
while(group--)
{
scanf("%d%d",&n,&m);
mst(path,);
mst(pic,inf);
mst(used,);
for(i=; i<m; ++i)
{
scanf("%d%d%d",&x,&y,&v);
pic[x][y]=pic[y][x]=v;
}
ans=;
if(prim()) printf("%d\n",ans);
else printf("Not Unique!\n");
}
return ;
}
kruskal:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
#define Min(x,y) (x<y?x:y)
#define Max(x,y) (x>y?x:y)
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 100000007
#define inf 0x3f3f3f3f
#define N 100005
#define maxn 1000050
typedef long long LL;
typedef pair<int,int> PII; int n,m,cnt,vis[6000],fp[105]; ///vis[]是标记第一次求mst时用过哪些边(后面枚举删边时用到)
struct Node{
int x,y,v;
bool operator<(const Node&a)const{
return v<a.v;
}
Node(){}
Node(int a,int b,int c):x(a),y(b),v(c){}
}node[6000];
int findp(int x){return fp[x]==x?x:fp[x]=findp(fp[x]);} int kus(int xx){ ///xx表示删除哪条边
int res=0;
for(int i=0;i<=n;++i)fp[i]=i;
int num=1;
for(int i=0;i<cnt;++i){
if(i==xx)continue;
int x=findp(node[i].x);
int y=findp(node[i].y);
if(x==y)continue;
res+=node[i].v;
fp[x]=y;
if(xx==inf)vis[i]=1;
if(++num==n)break;
}
if(num<n)return inf;
else return res;
} int main(){
int x,y,v,i,j,group,Case=0,m;
//freopen("in.txt","r",stdin);
scanf("%d",&group);
while(group--){
mst(vis,0);
scanf("%d%d",&n,&m);
cnt=0;
while(m--){
scanf("%d%d%d",&x,&y,&v);
node[cnt++]=Node(x,y,v);
}
sort(node,node+cnt);
int res=kus(inf),ans=inf;
for(i=0;i<cnt;++i){
if(vis[i])
ans=Min(ans,kus(i));
}
if(ans==res)printf("Not Unique!\n");
else printf("%d\n",res);
}
return 0;
}
次小生成树模板(poj1679)的更多相关文章
- poj 2831 次小生成树模板
/*次小生成树 题意:给你一些路径,现在将一部分路径权值减少后问是否可以替代最小生成树里面的边. 解:次小生成树,即将这条边连上,构成一个环 求出任意两点路径之间的除了这条边的最大值,比较这个最大值& ...
- poj1679The Unique MST(次小生成树模板)
次小生成树模板,别忘了判定不存在最小生成树的情况 #include <iostream> #include <cstdio> #include <cstring> ...
- POJ-1679 The Unique MST,次小生成树模板题
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Description Given a connected undirec ...
- POJ_1679_The Unique MST(次小生成树模板)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23942 Accepted: 8492 D ...
- poj 1679 The Unique MST (次小生成树模板题)
Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spann ...
- 次小生成树(poj1679)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20737 Accepted: 7281 D ...
- POJ 1679 The Unique MST 【最小生成树/次小生成树模板】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22668 Accepted: 8038 D ...
- uva10600次小生成树模板题
裸题,上模板就行,注意j ! = k #include<map> #include<set> #include<cmath> #include<queu ...
- POJ -1679(次小生成树)模板
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions:34617 Accepted: 12637 D ...
随机推荐
- linux上MySQL改动password的各种方法,yc整理
MySQL改动password的各种方法 整理了下面四种在MySQL中改动rootpassword的方法,可能对大家有所帮助! 方法1: 用SET PASSWORD命令 mysql -uroot my ...
- 阿里云ECS linux通过rinetd 端口转发来访问内网服务
一.场景说明: 可以通过端口映射的方式,来通过具有公网的云服务器 ECS 访问用户名下其它未购买公网带宽的内网 ECS 上的服务.端口映射的方案有很多,比如 Linux 下的 SSH Tunnel.r ...
- MyEclipse图表工具Birt的使用技巧(三)--连接webservice数据源
Web Services 技术是一套标准.它定义了应用程序怎样在Web上实现互操作. 用户能够使用不论什么语言.在不同的平台下编写Web Services.然后通过Web Services 的标准来对 ...
- php解耦的三种境界
我们有三个类,Db,FileSystem,Session;实际业务需求要组合操作这三个类. 一.常规做法 class Db { public function read($id) { } } clas ...
- B3:状态模式 State
当一个对象内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决当控制一个对象状态转换条件表达式过于复杂时的情况,把状态判断逻辑移到表示不同状态的一系列类中.如果状态判断很简单, ...
- 协程基础_context系列函数
近期想看看协程,对这个的详细实现不太了解.查了下,协程最常规的做法就是基于makecontext,getcontext,swapcontext这类函数在用户空间切换用户上下文. 所以在这通过样例代码尽 ...
- Vue 状态管理 Vuex
1.概述 Vuex作为插件,管理和维护整个项目的组件状态. 2.安装vuex cnpm i --save vuex 3.vuex使用 github地址:https://github.com/MengF ...
- JavaScript内存示意图
一.JavaScript内存示意图 二.js原理 1.js执行规则 (1)先定义 定义变量.定义函数.顺序:自上而下. (2)后执行 除了定义外的代码都是执行代码.顺序:自上而下. 2.动态开辟内存 ...
- Ruby 第一行代码
main.rb #=猜数字 #这是一个简单的猜数字游戏 #==玩法 #随机生成一个『1,100』的自然数.会提示大小 class GuessNum def playGame wrongInt = tr ...
- linux 自启动
使用chkconfig命令可以查看在不同启动级别下课自动启动的服务(或是程序),命令格式如下:chkconfig --list可能输出如下:openvpn 0:关闭 1:开启 ...... 6:关闭 ...