The Unique MST(最小生成树的唯一路径)

简介: The Unique MST(最小生成树的唯一路径)

最小生成树唯一的路径就是当前权值里,仅有一条路可以走,不存在最小权值一样的情况,如:1 2 2, 2 3 2, 1 3 2,第一次路径为1—2权值为2,但当下一次到3这个点时就存在分歧,因为1—3的权值是2,2—3的权值也是2,有两个选择。

例题: https://vjudge.net/contest/319242#problem/K

Given a connected undirected graph, tell if its minimum spanning tree is unique.

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

The first line contains a single integer t (1 <= t <= 20), the number of test cases. Each case represents a graph. It begins with a line containing two integers n and m (1 <= n <= 100), the number of nodes and edges. Each of the following m lines contains a triple (xi, yi, wi), indicating that xi and yi are connected by an edge with weight = wi. For any two nodes, there is at most one edge connecting them.

Output

For each input, if the MST is unique, print the total cost of it, or otherwise print the string ‘Not Unique!’.

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!

解题思路:最短路径的prime算法,求出每一次到顶点的权值,然后比较各个点到最短边的权值是否有相同的,注意:会存在至少一条边满足相同,那就是本身这条边。

程序代码:

#include<stdio.h>
#include<string.h>
int e[2000][2000],dis[5000],book[5000];
int inf=99999999;
int main()
{
  int i,j,k,n,m,t1,t2,t3,min,l,v,sun;
  int count,sum;
  int N,flag;
  scanf("%d",&N);
  while(N--)
  {
    flag=0;
    count=0;
    sum=sun=0;
    l=1;
    memset(dis,0,sizeof(dis));
    memset(book,0,sizeof(book));
    memset(f,0,sizeof(f));
    memset(a,0,sizeof(a));
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
        if(j==i)  e[i][j]=0;
        else    e[i][j]=inf;
    for(i=1;i<=m;i++)
    {
      scanf("%d%d%d",&t1,&t2,&t3);
      if(e[t1][t2]>t3)//可能同样的边会出现两次,所以取较短的边
      {
        e[t1][t2]=t3;
        e[t2][t1]=t3;
      }
    }
    for(i=1;i<=n;i++)
      dis[i]=e[1][i];
    book[1]=1;
    count++;
    while(count<n)
    {
      min=inf;
      for(i=1;i<=n;i++)
      {
        if(book[i]==0&&dis[i]<min)
        {
          min=dis[i];
          j=i;
        }
      }
      sun=0;//初始化有相同边的数目
      for(v=1;v<=n;v++)//寻找n条边中已经标记的的边中是否有相同的边
        if(book[v]==1&&min==e[v][j])
          sun++;
      if(sun>1)//sun>1说明最少有一条边与当前最小值一样
        break;
      book[j]=1;
      sum+=dis[j];
      count++;
      for(k=1;k<=n;k++)
        if(book[k]==0&&dis[k]>e[j][k])
          dis[k]=e[j][k]; 
    }
    if(sun<=1)
      printf("%d\n",sum);
    else
      printf("Not Unique!\n");
  }
  return 0;
}
相关文章
|
11月前
|
存储 前端开发 Java
深入理解后端开发:从基础到高级
本文将带你走进后端开发的神秘世界,从基础概念到高级应用,一步步揭示后端开发的全貌。我们将通过代码示例,让你更好地理解和掌握后端开发的核心技能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和启示。
509 6
|
10月前
|
机器学习/深度学习 人工智能 算法
FinRobot:开源的金融专业 AI Agent,提供市场预测、报告分析和交易策略等金融解决方案
FinRobot 是一个开源的 AI Agent 平台,专注于金融领域的应用,通过大型语言模型(LLMs)构建复杂的金融分析和决策工具,提供市场预测、文档分析和交易策略等多种功能。
998 13
FinRobot:开源的金融专业 AI Agent,提供市场预测、报告分析和交易策略等金融解决方案
|
10月前
|
弹性计算 运维 自然语言处理
Copilot测评报告------终端智能化
作为一名后端开发工程师,我日常需要进行云资源的运维和管理。2025年初,我尝试了阿里云推出的OS Copilot,这款基于大模型的操作系统智能助手支持Alinux、CentOS、Ubuntu等系统,具备自然语言问答、辅助命令执行、系统运维调优等功能。安装过程简单流畅,通过简单的配置即可使用。Copilot不仅能处理复杂指令,还能解释管道命令,极大提升了Linux系统的使用效率。尤其在agent模式下,智能化程度更高,显著减轻了工程师的工作负担。总的来说,Copilot的表现令人惊艳,终端操作从此更加智能便捷。
|
11月前
|
监控 搜索推荐 API
京东商品详情API接口的开发、应用与收益探索
在数字化和互联网高速发展的时代,京东通过开放商品详情API接口,为开发者、企业和商家提供了丰富的数据源和创新空间。本文将探讨该API接口的开发背景、流程、应用场景及带来的多重收益,包括促进生态系统建设、提升数据利用效率和推动数字化转型等。
292 3
|
算法 搜索推荐 安全
来自一线技术人的经验分享|如何写出让人眼前一亮的述职报告
本文作者从亲身经验阐述了一线技术人为什么述职、怎么述职以及述职的重要性。每年述职都是一大关,作者把自己的一些经验教训通过文字分享给大家,希望能帮助到更多的人。
37864 14
来自一线技术人的经验分享|如何写出让人眼前一亮的述职报告
|
图形学
【实现100个unity特效之2】使用shader和shader Graph实现2d图片描边效果(附源码)
【实现100个unity特效之2】使用shader和shader Graph实现2d图片描边效果(附源码)
1139 0
|
缓存 JSON JavaScript
深入理解RESTful API设计原则与最佳实践
- REST是一种基于HTTP的Web服务设计风格,强调资源、统一接口和无状态性。 - 设计原则:统一接口(资源标识、操作、自描述消息、无状态),资源中心,标准方法,分层系统和缓存。 - 最佳实践:版本控制、JSON格式、有意义的状态码、HATEOAS和安全性(HTTPS,认证,授权)。 - 示例:使用Node.js和Express实现用户管理API,包括GET、POST、PUT和DELETE操作,展示资源操作的基本实现。 代码示例展示了如何创建、读取、更新和删除用户资源,以及处理HTTP状态码和错误情况。实际应用时,需进一步完善安全和性能优化。
2123 0
|
缓存 编解码 前端开发
页面加载性能分析时,有哪些常见的性能瓶颈需要特别注意?
页面加载性能分析时,有哪些常见的性能瓶颈需要特别注意?
|
Oracle 关系型数据库 数据库
Oracle 数据库表中截取 两个 | 之间的内容,substr() instr()
Oracle 数据库表中截取 两个 | 之间的内容,substr() instr()
|
机器学习/深度学习 算法 数据挖掘
技术经验分享:DTW和DBA
技术经验分享:DTW和DBA
248 0