博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TopCoder 算法比赛图论实战1—最小生成树问题
阅读量:4879 次
发布时间:2019-06-11

本文共 1729 字,大约阅读时间需要 5 分钟。

这个问题需要求解在一个城市网中,连接所有城市的最小代价,一个典型的最小生成树问题。

需要注意的是,每个城市只能朝一个方向修路,所以两个城市之间的最小代价不是(X+Y)/2,而是Max(X,)
解决方案如下:

using System;

using System.Collections.Generic;
using System.Collections;
using System.Text;
//最小生成树问题
public class CityLink
{
int N;
bool[,] map;
bool[] visited;
bool AllConnect()
{
  visited = new bool[N];//very importent!!!!
  dfs(0);
  for (int i = 0; i < N; i++)
    if (!visited[i])
       return false;
  return true;
}
void dfs(int i)
{
  visited[i] = true;
  for (int j = 0; j < N; j++)
    if (map[i, j] && !visited[j])
      dfs(j);
}
public int timeTaken(int[] x, int[] y)
{
  N = x.Length;
  int[,] d = new int[N, N];
  map = new bool[N, N];
  List<int> edgesv = new List<int>();//所有不同长度的边
  Hashtable edges = new Hashtable();//每个边都连接了哪些顶点
  for (int i = 0; i != N; i++)
    for (int j = i; j != N; j++)
    {
      if (x[i] == x[j])
        d[i, j] = (Math.Abs(y[i] - y[j]) + 1) / 2;
      else if (y[i] == y[j])
        d[i, j] = (Math.Abs(x[i] - x[j]) + 1) / 2;
      //只能朝一个方向走,不能改变方向?
      else
        d[i, j] = Math.Max(Math.Abs(x[i] - x[j]), Math.Abs(y[i] - y[j]));
        //d[i, j] = (Math.Abs(x[i] - x[j]) + Math.Abs(y[i] - y[j]) + 1) / 2;
      if (!edgesv.Contains(d[i, j]))
        edgesv.Add(d[i, j]);
      if (edges.Contains(d[i, j]))
      {
        ((List<int>)edges[d[i, j]]).Add(i);
        ((List<int>)edges[d[i, j]]).Add(j);
      }
      else
      {
        List<int> tmp = new List<int>();
        tmp.Add(i);
        tmp.Add(j);
        edges.Add(d[i, j], tmp);
      }
    }
  edgesv.Sort();//Kruskal算法需要从最小的边开始,所以这里排序一下
  //Kruskal
  for (int i = 0; i < edgesv.Count; i++)
  {
  //Conect two points
    List<int> points = (List<int>)edges[edgesv[i]];
    for (int j = 0; j < points.Count; j += 2)
    {
      map[points[j], points[j + 1]] = true;
      map[points[j+1], points[j]] = true;
    }
    if (AllConnect())
      return edgesv[i];
  }
  return -1;
}

>
aggbug.ashx?id=77febd91-a9d2-4a95-9d54-8802a1736ec7

Ecogiser's Blog

转载于:https://www.cnblogs.com/ecogiser/archive/2006/06/15/477617.html

你可能感兴趣的文章
DataTable 和Json 字符串互转
查看>>
Django中Template does not exit
查看>>
Redis安装 java中的连接 序列化 反序列化
查看>>
hdu 1896 优先队列的应用
查看>>
递推和迭代的比较
查看>>
OpenGL 头文件,库文件
查看>>
点与不规则图形关系判断
查看>>
linux不开启图形界面
查看>>
菜鸟学习SSH(二)——Struts国际化
查看>>
iOS 自定义控件--重写一些方法
查看>>
第二次冲刺作业
查看>>
【转】HTML, CSS和Javascript调试入门
查看>>
折线图-小案例
查看>>
STL:优先队列Priority Aueue
查看>>
蓝桥历年试题 套娃
查看>>
EF4.0和EF5.0增删改查的写法区别及执行Sql的方法
查看>>
作业一
查看>>
微信支付体验
查看>>
Excel导数据到数据库
查看>>
zz 悲催的程序员,以及程序员的悲催
查看>>