ACM唯一的最小生成树
Description
求一个非负权边的无向连通图的最小生成树,如果这个无向图存在两个或两个以上的最小生成树,就输出Not Unique,否则输出最小生成树的边的权值和。
输入:
第一行是一个整数K,表示有多少个测试用例,以后每个测试用例占m+1行。每个测试用例的第一行为两个整数n,m(3<=n<=100),表示图的顶点数和边数,从第二行开始每行为三个整数i,j,w,表示从i到j顶点的权值。
输出:
每行输出一个测试用例的结果。如果这个无向图存在两个或两个以上的最小生成树,就输出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
#include<iostream>
using namespace std;
int a[110][110],b[110];
bool mark[110],flag;
int cases,n,m,i,j,k,minn,minsum,pre,next,x,y,z;
int main()
{
scanf("%d",&cases);
while(cases--)
{
memset(mark,false,sizeof(mark));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
minsum=0;flag=false;
mark[1]=true;b[1]=1;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); a[x][y]=z;a[y][x]=z; }
for(k=2;k<=n;k++){
minn=9999999;
for(i=1;i<=k;i++){
for(j=1;j<=n;j++){
if(!mark[j]) {
if(a[b[i]][j]<minn&&a[b[i]][j]!=0) { minn=a[b[i]][j]; next=j; pre=b[i]; }
}
}
}
b[k]=next;
for(i=1;i<=k;i++)
{
if(b[i]==pre) continue;
if(a[b[i]][next]==minn) { flag=true; break; }
}
if(flag) break;
mark[next]=true;
minsum+=minn;
}
if(flag) printf("Not Unique\n"); else printf("%d\n",minsum);
}
return 0;
}
分享到:
相关推荐
总结来说,这个C++程序通过最小堆实现了一个高效的Prim最小生成树算法,能够快速找到无向图的最小生成树,从而在大规模图数据中找到最优的边集合。在实际应用中,这种优化算法常用于网络设计、资源分配等需要最小化...
在这个ACM习题中,你可能需要实现Prim算法或Kruskal算法来找到最小生成树。Prim算法从一个初始节点开始,逐步添加边,每次添加的边都是当前未加入树的边中与树中节点连接且权重最小的那条。而Kruskal算法则是按边的...
2. **图论算法**:Dijkstra最短路径算法、Floyd-Warshall所有对最短路径、拓扑排序、Prim最小生成树、Kruskal最小生成树等。 3. **动态规划**:背包问题、最长公共子序列、最长递增子序列等,这些问题在ACM中很常见...
请输出无向连通图最小生成树权重之和。 输入 第一行是2个整数,分别表示顶点个数n和边数m。接下来的m行中,每一行第一个整数表示边的开始顶点,第二个表示边的结束顶点,第三个表示这条边的权重。 ( 测试数据中保证图...
可供直接使用,包括:KM算法、K短路、SPFA、强连通分量、最小生成树、最大最小流、割点和桥、哈密顿回路等等。 包含了图论相关的C++代码模板文件 可供直接使用,包括:KM算法、K短路、SPFA、强连通分量、最小生成树...
- 图:图论是ACM竞赛中的核心部分,如最短路径(Dijkstra、Floyd)、最小生成树(Prim、Kruskal)等。 2. **排序与搜索算法** - 冒泡排序、插入排序、选择排序:基础排序算法,用于理解排序原理。 - 快速排序、...
4. **贪心算法**:在每一步选择最优解,适用于优化问题,如最小生成树、区间调度等。 5. **回溯与剪枝**:用于解决组合优化问题,如八皇后问题、N皇后问题等。 6. **图论算法**:最短路径(Dijkstra、Floyd、Bellman...
2. **图论**:图论是研究图的数学分支,ACM中涉及到的图论算法包括最短路径(Dijkstra、Floyd-Warshall)、拓扑排序、最小生成树(Prim、Kruskal)等。理解图的性质和操作是解决这类问题的基础。 3. **字符串**:...
4. **1517.cpp**:这可能是一个更复杂的算法问题,可能需要解决的问题类型包括最短路径、最小生成树、贪心算法等。C++中的STL(标准模板库)在这里可能会起到重要作用,例如使用优先队列或图容器。 5. **1350.cpp**...
C++示例代码展示了如何实现Kruskal算法,包括定义边结构体`edge`,并查集相关函数如`ancestor`、`same`和`merge`,以及主函数`main`中的输入读取、边的排序和最小生成树的构造过程。 在实际编程竞赛或算法设计中,...
图算法在ACM程序设计竞赛中占有重要地位,包括图的遍历、最小生成树、最短路径等经典问题。 - **图的深度优先和广度优先算法**:图的遍历是探索图中节点的基本方法,包括深度优先搜索(DFS)和广度优先搜索(BFS)。DFS...
核心观察点在于,只有当两对小行星之间的距离d(i1, j1)和d(i2, j2)相等时,最小生成树才可能发生变化。计算特定时间点两对小行星间距离相等的时间,归结为解二次方程。对于给定的小行星数量n,存在最多\(2 \times (n...
【知识点详解】 ...总的来说,这些知识点涵盖了ACM竞赛的算法基础,包括动态规划、博弈论、递归、图论(最小生成树)以及数据结构(四分树)的应用,同时也涉及了C++编程基础,如数据结构的实现和算法的编写。
1. **基础算法**:包括排序(快速排序、归并排序、堆排序等)、搜索(二分查找、深度优先搜索、广度优先搜索等)、图论(最小生成树、最短路径等)和动态规划。 2. **高级算法**:如回溯法、分支限界法、贪心算法、...
最小生成树 Prim 算法 每对节点间最短路径 Flod-Warshall 算法 语言 C++ 编译平台 VisualAge C++ 4.0 作者 starfish (starfish.h@china.com) 备注 程序用C++语言编写,在VisualAge C++ 4.0下调试通过。压缩包内...
1. **基础算法**:包括排序(快速排序、归并排序、堆排序等)、搜索(二分查找、深度优先搜索、广度优先搜索等)、图论(最短路径算法、最小生成树等)和动态规划。 2. **数据结构**:数组、链表、栈、队列、哈希表...
2. **最小生成树**:Kruskal算法和Prim算法是求解加权无向图最小生成树的两种主要方法。Kruskal算法通过按边权递增顺序选择不构成环的边来构建最小生成树;Prim算法则是从任意一个顶点出发,逐步加入到当前树中最近...
从描述来看,这些代码模板是作者在参加ACM竞赛中积累的,用于解决竞赛中常见的问题,比如最小生成树、最短路、并查集、线段树、动态规划、博弈论、树状数组等。 在【部分内容】中列举了各种算法和技术,具体知识点...
2. **高级数据结构**:树(二叉树、平衡树如AVL、红黑树)、图(深度优先搜索DFS、广度优先搜索BFS、最小生成树Kruskal和Prim)、动态规划状态转移等。 3. **数学知识**:组合数学、数论、线性代数、图论、概率论等...