poj 1679 The Unique MST(次小生成树)
来源:互联网 发布:c语言进阶的书 编辑:程序博客网 时间:2024/06/07 06:24
题意:判断最小生成树是否唯一。
思路:求出次小生成树,如果与最小生成树相等,则不唯一。
ps博客
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;/*求最小生成树时,用数组Max[i][j]来表示MST中i到j路径中的最大权边求完后,直接枚举所有不在MST中的边,替换掉最大权边的边,更新答案点编号从0开始*/const int MAXN=110;const int INF=0x3f3f3f3f;//1061109567bool vis[MAXN];int lowc[MAXN];int pre[MAXN];int Max[MAXN][MAXN];//Max[i][j]表示在最小生成树中从i到j的路径中的最大边权bool used[MAXN][MAXN];int cost[MAXN][MAXN];int ans;int prim(int cost[][MAXN],int n){ int ans=0; memset(vis,false,sizeof(vis)); memset(Max,0,sizeof(Max)); memset(used,false,sizeof(used)); vis[0]=true; pre[0]=-1; for(int i=1;i<n;i++){ lowc[i]=cost[0][i]; pre[i]=0; } lowc[0]=0; for(int i=1;i<n;i++){ int minc=INF; int p=-1; for(int j=0;j<n;j++) if(!vis[j]&&minc>lowc[j]){ minc=lowc[j]; p=j; } if(minc==INF)return -1; ans+=minc; vis[p]=true; used[p][pre[p]]=used[pre[p]][p]=true; for(int j=0;j<n;j++){ if(vis[j])Max[j][p]=Max[p][j]=max(Max[j][pre[p]],lowc[p]); if(!vis[j]&&lowc[j]>cost[p][j]){ lowc[j]=cost[p][j]; pre[j]=p; } } } return ans;}int smst(int cost[][MAXN],int n){ int Min=INF; for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) if(cost[i][j]!=INF&&!used[i][j]){ Min=min(Min,ans+cost[i][j]-Max[i][j]); } if(Min==INF)return -1;//不存在 return Min;}int main(){ int t,i,j; int n,m; int u,v,w; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<n;j++){ if(i==j)cost[i][j]=0; else cost[i][j]=INF; } while(m--){ scanf("%d%d%d",&u,&v,&w); u--;v--; cost[u][v]=cost[v][u]=w; } ans=prim(cost,n); if(ans==-1)printf("Not Unique!\n"); else if(ans==smst(cost,n))printf("Not Unique!\n"); else printf("%d\n",ans); } return 0;}
0 0
- poj 1679 The Unique MST(次小生成树)
- poj 1679 The Unique MST(次小生成树)
- POJ 1679 The Unique MST (次小生成树)
- POJ - 1679 The Unique MST (次小生成树)
- poj 1679 The Unique MST (次小生成树)
- poj 1679 The Unique MST(次小生成树)
- POJ 1679The Unique MST(次小生成树)
- poj 1679 The Unique MST(次小生成树)
- POJ - 1679 - The Unique MST (次小生成树)
- poj 1679 The Unique MST (次小生成树)
- POJ 1679 The Unique MST (次小生成树)
- poj 1679 The Unique MST(次小生成树)
- POJ 1679 The Unique MST(次小生成树)
- POJ-1679-The Unique MST(次小生成树)
- POJ 1679 The Unique MST(次小生成树)
- POJ 1679 The Unique MST(次小生成树)
- POJ 1679-The Unique MST(次小生成树)
- POJ 1679 The Unique MST (次小生成树)
- 数据结构实验——二叉树实验
- java反射机制及具体实现
- Android开发之Fragment回退栈
- poj 1322 概率dp
- PAT_1033. To Fill or Not to Fill
- poj 1679 The Unique MST(次小生成树)
- 35个jQuery小技巧!
- 测试
- 关于Geocoding定位
- java内存分配小知识
- Python学习笔记-循环for&while
- Google相关的Hosts文件——全部内容
- Mesos+ZooKeeper+Marathon+Docker
- tomcat 启动时报错:To prevent a memory leak, the JDBC Driver has been forcibly unregistered