【转】最小树形图 模版--朱刘算法

 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)    收藏  举报

导航