求最小生成树代码?c#的,谢谢啦!

解决方案 »

  1.   

    Treenode node =new Treenode("树");
    node.node.add("根");
    td.node.add(node);\\td是控件的名称
     这段代码可以生成一棵有“根”的”树“
      

  2.   

    A.Prim算法:
      procedure prim(v0:integer);
      var
      lowcost,closest:array[1..maxn] of integer;
      i,j,k,min:integer;
      begin
      for i:=1 to n do begin
      lowcost[i]:=cost[v0,i];
      closest[i]:=v0;
      end;
      for i:=1 to n-1 do begin
      {寻找离生成树最近的未加入顶点 k}
      min:=maxlongint;
      for j:=1 to n do
      if (lowcost[j]<min) and (lowcost[j]<>0) then begin
      min:=lowcost[j];
      k:=j;
      end;
      lowcost[k]:=0; {将顶点k 加入生成树}
      {生成树中增加一条新的边 k 到 closest[k]}
      {修正各点的 lowcost 和 closest 值}
      for j:=1 to n do
      if cost[k,j]<lowcost[j] then begin
      lowcost[j]:=cost[k,j];
      closest[j]:=k;
      end;
      end;
      end;
      B.Kruskal算法:(贪心)
      按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。
      function find(v:integer):integer; {返回顶点 v 所在的集合}
      var i:integer;
      begin
      i:=1;
      while (i<=n) and (not v in vset) do inc(i);
      if i<=n then find:=i else find:=0;
      end;
      procedure kruskal;
      var
      tot,i,j:integer;
      begin
      for i:=1 to n do vset:=i;{初始化定义 n 个集合,第 I个集合包含一个元素 I}
      p:=n-1; q:=1; tot:=0; {p 为尚待加入的边数,q 为边集指针}
      sort;
      {对所有边按权值递增排序,存于 e中,e.v1 与 e.v2 为边 I 所连接的两个顶点的
      序号,e.len 为第 I条边的长度}
      while p>0 do begin
      i:=find(e[q].v1);j:=find(e[q].v2);
      if i<>j then begin
      inc(tot,e[q].len);
      vset:=vset+vset[j];vset[j]:=[];
      dec(p);
      end;
      inc(q);
      end;
      writeln(tot);
      end;