-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
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'.
输入
- 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. 输出
- For each input, if the MST is unique, print the total cost of it, or otherwise print the string 'Not Unique!'. 样例输入
-
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
样例输出
-
3 Not Unique!
来源
- POJ Monthly--2004.06.27 srbga@POJ
需要生成最小生成树之后,遍历去掉树上的每一条边,看生成的最小生成树是否与原本的最小生成树权重相同。
注意需要考虑当图是一棵树,并且每条边的长度都为0时的情况。
sort()默认从小到大排序。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <climits>
#include <vector>
#include <algorithm>
using namespace std;
struct node
{
public:
int u, v, w;
bool operator < (node b)
{
return w < b.w;
}
}graph[10005];
int father[105];
bool MST[10005];
int n, m;
int findfather(int x)
{
if(father[x] != x)
{
father[x] = findfather(father[x]);
}
return father[x];
}
int kruskal(int e)
{
int cost = 0;
int num = 0;
for(int j = 1; j <= n; j++)
{
father[j] = j;
}
for(int j = 0; j < m; j++)
{
if(num >= n - 1)
break;
if(j == e)
continue;
int x = graph[j].u;
int y = graph[j].v;
if(findfather(x) != findfather(y))
{
father[father[x]] = father[y];
cost += graph[j].w;
num++;
//cout << "j:" << j << "\tcost:" << cost << endl;
if(e == -1)
MST[j] = true;
}
}
return cost;
}
int main()
{
//freopen("test.txt", "r", stdin);
ios::sync_with_stdio(false);
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
memset(MST, false, sizeof(MST));
for(int i = 0; i < m; i++)
{
int xi, yi, wi;
scanf("%d%d%d", &xi, &yi, &wi);
graph[i].u = xi;
graph[i].v = yi;
graph[i].w = wi;
}
sort(graph, graph + m);
int cost1 = kruskal(-1);
int cost2;
bool flag = false;
if(m == n - 1)
{
printf("%d\n", cost1);
continue;
}
for(int i = 0; i < m; i++)
{
if(MST[i])
{
cost2 = kruskal(i);
if(cost1 == cost2)
{
flag = true;
break;
}
}
}
if(flag)
printf("Not Unique!\n");
else
printf("%d\n", cost1);
}
return 0;
}