poj 1679 The Unique MST(判断最小生成树是否唯一)

2024-02-03 05:32

本文主要是介绍poj 1679 The Unique MST(判断最小生成树是否唯一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:http://poj.org/problem?id=1679

思路:

(1) 对图中每条边,扫描其他边,如果存在相同权值的边,则对该边作标记。

(2)求最小生成树。

(3)如果该最小生成树中未包含作了标记的边,则可以判定其唯一;否则,依次去掉这些边再求最小生成树,如果求得的权值和原来的相同,则判定不唯一。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int u,v,w;
} t[10005];
int fa[105];
int vis[10005];
int p[100005]; //标记,其他边权值是否跟该边一样
int d[100005]; //是否删除的标记
int flag;   //第一次求最小生成树的标志变量
int n,m;
bool cmp(node a,node b)
{
return a.w<b.w;
}
int find(int x)
{
if(x==fa[x])
return x;
return find(fa[x]);
}
void Union(int x,int y)
{
int a=find(x),b=find(y);
if(a!=b)
{  
if(a>b)
fa[b]=a;
else
fa[a]=b;
}
}
int kruskal()
{
int i,ans=0,num=0;
for(i=0;i<n;i++)
fa[i]=i;
for(i=0;i<m;i++)
{
if(d[i]==1)
continue;
if(find(t[i].u)!=find(t[i].v))
{
ans+=t[i].w;
num++;
Union(t[i].u,t[i].v);
if(flag)
vis[i]=1;
}
if(num>=n-1)
break;
}
return ans;
}
int main()
{
int u,v,w,i,j,cas;
scanf("%d",&cas);
while(cas--)
{ 
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
t[i].u=u-1,t[i].v=v-1,t[i].w=w;
p[i]=0,d[i]=0,vis[i]=0;
}
for(i=0;i<m;i++)  //标记相同权值的边
{
for(j=0;j<m;j++)
{
if(i==j)
continue;
if(t[i].w==t[j].w)
p[i]=1;
}
}
sort(t,t+m,cmp);
flag=1;
int w1=kruskal(),w2;
flag=0;
for(j=0;j<m;j++)
{
if(vis[j]&&p[j])
{
d[j]=1;
w2=kruskal();
if(w1==w2)
{
printf("Not Unique!\n");
break;
}
d[j]=0;
}
}
if(j>=m)
printf("%d\n",w1);
}
return 0;
}


 

这篇关于poj 1679 The Unique MST(判断最小生成树是否唯一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/673114

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

查询Oracle数据库表是否被锁的实现方式

《查询Oracle数据库表是否被锁的实现方式》本文介绍了查询Oracle数据库表是否被锁的方法,包括查询锁表的会话、人员信息,根据object_id查询表名,以及根据会话ID查询和停止本地进程,同时,... 目录查询oracle数据库表是否被锁1、查询锁表的会话、人员等信息2、根据 object_id查询被

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram