【转】最小树形图 模版--朱刘算法
1 #define INF 0x7fffffff 2 #define MAXN 1005 3 typedef __int64 type; 4 struct node 5 { 6 int u, v; 7 type w; 8 }edge[MAXN * MAXN]; 9 int pre[MAXN],id[MAXN],vis[MAXN],n,m,pos; 10 type in[MAXN]; 11 type Directed_MST(int root, int V, int E) 12 { 13 int i; 14 type ret = 0; 15 while(true) 16 { 17 //1.找最小入边 18 for(i=0;i<V;i++) 19 in[i]=INF; 20 for(i=0;i<E;i++) 21 { 22 int u = edge[i].u; 23 int v = edge[i].v; 24 if(edge[i].w < in[v] && u != v) 25 { 26 pre[v] = u; 27 in[v] = edge[i].w; 28 if(u == root) 29 pos = i; 30 } 31 } 32 for(i = 0; i < V; i++) 33 { 34 if(i == root) continue; 35 if(in[i] == INF) return -1;//除了跟以外有点没有入边,则根无法到达它 36 } 37 //2.找环 38 int cnt = 0; 39 memset(id, -1, sizeof(id)); 40 memset(vis, -1, sizeof(vis)); 41 in[root] = 0; 42 for(i = 0; i < V; i++) //标记每个环 43 { 44 ret += in[i]; 45 int v = i; 46 while(vis[v] != i && id[v] == -1 && v != root) 47 { 48 vis[v] = i; 49 v = pre[v]; 50 } 51 if(v != root && id[v] == -1) 52 { 53 for(int u = pre[v]; u != v; u = pre[u]) id[u] = cnt; 54 id[v] = cnt++; 55 } 56 } 57 if(cnt == 0) break; //无环 则break 58 for(i = 0; i < V; i++) 59 if(id[i] == -1) id[i] = cnt++; 60 //3.建立新图 61 for(i = 0; i < E; i++) 62 { 63 int u = edge[i].u; 64 int v = edge[i].v; 65 edge[i].u = id[u]; 66 edge[i].v = id[v]; 67 if(id[u] != id[v]) edge[i].w -= in[v]; 68 } 69 V = cnt; 70 root = id[root]; 71 } 72 return ret; 73 }
posted on 2012-08-13 11:42 acoderworld 阅读(67) 评论(0) 收藏 举报
浙公网安备 33010602011771号