现在的位置: 首页 > 综合 > 正文

poj 1679 The Unique MST(kruskal)

2018年03月17日 ⁄ 综合 ⁄ 共 971字 ⁄ 字号 评论关闭
题意:给一个图,问其最小生成树是否惟一。

思路:用Kruskal 算出最小生成树的值,并记录每一条边,然后枚举去掉这些边 看其是否也能构成最小生成树且值相同。注意
在删边后,可能图构不成一棵树,得判断一下

//264K   
16MS
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define M 10010
#define N 105
using namespace std;

struct E
{
    int
u,v,w;
} edge[M];
int n,m,mst;
int parent[N];
bool flag;

bool cmp (E a,E b)
{
    return a.w
< b.w;
}

void Init ()   //并查集数组初始化
{
    for (int i =
0; i < N; i ++)
       
parent[i] = i;
}
int find (int x) //查找是否属同一集合
{
    if (x !=
parent[x])
       
parent[x] = find(parent[x]);
    return
parent[x];
}
void Kruskal ()
{
    int
i,j,u,v;
    int
path[M];
    mst =
0;
    i = 0,j =
0;
    flag =
true;
   
Init();
    while (j
< n-1&&i
< m)
    {
       
u = find (edge[i].u);
       
v = find (edge[i].v);
       
if (u != v)   //不在同一集合
       
{
           
parent[v] = u;
           
mst += edge[i].w;
           
path[j++] =
i;   
//记录路径
       
}
       
i ++;
    }

    for (int k =
0; k < n-1; k
++)   //枚举去掉每一条边
    {
       
int sum = 0;
       
j = 0,i = 0;
       
Init();
       
while (j < n - 1&&i
< m)
       
{
           
if (i == path[k])
           
{
               
i ++;
               
continue;
           
}
  

抱歉!评论已关闭.