題意:
判斷最小樹是否唯一。
思路:我用了兩種方法,主要就是好久沒敲了,找個水題練練手,第一種就是先一遍最小生成樹,然後列舉最小生成樹上的每一條邊,然後取消這條邊,在跑一遍最小生成樹,就這樣一直跑最小生成樹,如果找到了一顆和之前的那個一樣的,那麼就是不唯一,第二種方法也是先最小樹,然後列舉,在列舉的時候不是繼續重新跑,而是斷開當前邊,把樹分成兩個集合《兩次深搜實現》,然後在列舉這連個集合之間是否可以找到乙個可以代替當前列舉的最小樹的邊,實現複雜度的話應該是第二種快點,但理論上也快不多少,只是為了練練手,在多說一句,第二種方法和求次小樹的思路有點像,但是次小樹可以再這個上面進行dp優化,其實這個題目也可以直接判斷次小樹是否等於最小樹。好像有點說多了。
#include
#include
#include
#define n 110
using namespace std;
typedef struct
edge;
edge edge[n*n];
int mer[n] ,mst[n];
int finds(int x)
bool camp(edge a ,edge b)
int mst(int n ,int m ,int co)
if(sum == n - 1) break;
}return ans;
} int main ()
i == n || m == n - 1? printf("%d\n" ,ans) : puts("not unique!");
}return 0;
}#include
#include
#include
#define n 110
using namespace std;
typedef struct
edge;
typedef struct
star;
edge edge[n*n];
star e[n*n];
int map[n][n] ,mer[n] ,mark[n];
int list[n] ,tot ,mst[n];
int l[n] ,r[n] ,ll ,rr;
void add(int a, int b)
int finds(int x)
int minn(int x ,int y)
bool camp(edge a ,edge b)
int mst(int n ,int m)
if(sum == n - 1) break;
}return ans;
}void dfs1(int x)
}void dfs2(int x)
}int main ()
sort(edge + 1 ,edge + m + 1 ,camp);
int ans = mst(n ,m);
if(m == n - 1)
mk = 0;
for(i = 1 ;i < n && !mk;i ++)}}
mk ? printf("not unique!\n"): printf("%d\n" ,ans);
}return 0;
}
poj1679 最小生成樹
題目大意 判斷是否存在最小生成樹。如果存在,判斷其是否唯一。用prim演算法求最小生成樹。將其中的每一條邊依次替換,權值是否和最小生成樹相同。如果相同,則最小生成樹不唯一。如果都不相同,則唯一。這個prim的模板比較好,可以再求最小生成樹的同時直接進行判斷唯一性。如下 include include...
poj1679 最小生成樹
給定乙個圖,詢問是否存在不同的最小生成樹 思路 先用kru或者prim跑一條最小生成樹,把最小生成樹裡面的邊存起來,然後每次刪除一條邊跑最小生成樹演算法,看跑出來的生成樹和之前的是否一樣,如果一樣就有不同的最小生成樹,否則就沒有 注意 邊權為0的邊視為圖任然聯通,但是刪除這條邊時就不用和原來的比較 ...
唯一最小生成樹 POJ 1679
判斷mst時候唯一,用prime演算法,複雜度o n 2 define n 105 int n,m int dis n g n n bool vis n int mx n n 記錄路徑i j最大的邊值 int pre n 記錄最小生成樹路徑 bool intree n n 判斷哪些邊屬於mst in...