最小有向生成樹

2022-06-11 20:42:12 字數 3090 閱讀 7990

先看一下lrj的大白書上的講解

emm。。。我是看完之後直接看的模板題**。。。居然看懂。。。行吧。。

就是先判斷 能不能聯通  如能聯通 就求出每個點的最小前驅邊  求完之後 看有沒有環 如有環 縮點更新 然後一直重複 直至無環且聯通。。

//鄰接矩陣模板:

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define rap(i, a, n) for(int i=a; i<=n; i++)

#define mod 2018

#define ll long long

#define ull unsigned long long

#define pair pair#define mem(a, b) memset(a, b, sizeof(a))

#define _ ios_base::sync_with_stdio(0),cin.tie(0)

//freopen("1.txt", "r", stdin);

using

namespace

std;

const

int maxn = 10010, inf = 0x7fffffff

;int

n, m;

intvis[maxn], inc[maxn], pre[maxn];

double w[105][105

];struct

edge

edge[maxn];

void dfs(int

u)double dirmst(int

u)

//== 2.判斷是否有環

inti;

for(i=1; i<=n; i++) if(i != u && !inc[i])

//== 沒有找到環,得到答案

if(i >n)

//== 有環,則對這個環進行收縮

int j =i;

mem(vis, 0);

dowhile(j !=i);

inc[i] = false; //

環縮成了點i,點i仍然存在

for(int k=1; k<=n; k++) if(vis[k])}}

return

ans;

}void

init()

intmain()

rap(i,

1, m)

double ans = dirmst(1

);

if(ans < 0) puts("

poor snoopy");

else printf("

%.2f\n

", ans);

}return0;

}

//帶權結構體模板:

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define rap(i, a, n) for(int i=a; i<=n; i++)

#define mod 2018

#define ll long long

#define ull unsigned long long

#define pair pair#define mem(a, b) memset(a, b, sizeof(a))

#define _ ios_base::sync_with_stdio(0),cin.tie(0)

//freopen("1.txt", "r", stdin);

using

namespace

std;

const

int maxn = 10010, inf = 0x7fffffff

;int

id[maxn], in[maxn], vis[maxn], pre[maxn];

struct

node

node[maxn*2

];bool dirmst(int root, int n, int m, int cost, int

b) }

//2、判斷是否聯通

for(int i=0; i)

//3、找環

int cntnode = 0

; mem(id, -1

); mem(vis, -1

); in[root] = 0

;

for(int i=0; i)

//如果存在環 則把環中的點縮為乙個點

if(v != root && id[v] == -1

)

id[v] = cntnode++;}}

if(cntnode == 0) break; //

沒有環就結束

//重新標記其它點

for(int i=0; i)

if(id[i] == -1

) id[i] = cntnode++;

for(int i=0; i)

n =cntnode;

root =id[root];

}if(ans <=cost)

return

true

;

return

false;}

intmain()

if(!dirmst(0

, n, m, cost, l))

while(l <=r)

printf(

"%d kbps\n

", r);

}return0;

}

無向最小生成樹(prim 與krusckal)總結

之前學的時候一直感覺是兩個演算法沒什麼區別,今天總結一下 大體思路 prim演算法是做n次確定每乙個點,使其構成最小生成樹。而相對比的是krusckal演算法是做n 1次,找到n 1條最短邊,以此來確定n個點。假設給定n個點,以及m條邊,既然是無向的,且有可能使其連通,那麼邊數m必定是 n 1 m ...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...