7-1 畅通工程之局部最小花费问题(35 分)

#include
#define MAX 100
#define INFINITY 65535
bool marked[MAX];//标记是否合并
int pathMar[MAX][MAX];//所有路径长
int Dist[MAX];//当前连通量与其他连通量的最短距离

int main()
{
    int n;//村庄数
    scanf("%d", &n);
    for(int i = 0; i < n; i ++)
        for(int j = 0; j < n; j ++)
    {
        pathMar[i][j] = INFINITY;//将初始路径长度标志为最长路径长
    }
    int m = n * (n - 1) / 2;//输入行数
    for(int i = 0; i < m; i ++)
    {
        int a, b, c, d;//相互连通的两个村庄,花费,是否连通
        scanf("%d%d%d%d", &a, &b, &c, &d);
        if(d == 1)//如果连通不用计入成本
        {
            pathMar[a - 1][b - 1] = pathMar[b - 1][a - 1] = 0;
        }
        else
        {
            pathMar[a - 1][b - 1] = pathMar[b - 1][a - 1] = c;
        }
    }
    //初始化Dist
     for(int i = 0; i < n; i ++)
     {
         Dist[i] = pathMar[0][i];
     }

     marked[0] = 0;
     Dist[0] = 0;
     //标记第一个点,且第一个点到自己的距离为0
     int sum = 0;
     for(int i = 0; i < n; i ++)
     {
         int minPath = INFINITY;
         int order  = -1;
         for(int j = 0; j < n; j ++)
         {
             if(minPath > Dist[j] && !marked[j])
             {
                 minPath = Dist[j];//选择目前离联通量最小的路径
                 order = j;//记录离目前连通量最小的点的坐标
             }
         }
         //标记该点。合并
         marked[order] = true;
         //每合并一个点修改其他点到目前连通量的最小路径
         if(order != -1)
         {
             sum += minPath;
             for(int j = 1; j < n; j ++)
             {
                 if(Dist[j] > pathMar[order][j] && !marked[j])
                 //如果有点距离当前连通量的距离小于远距离则修改Dist
                 Dist[j] = pathMar[order][j];

             }
         }

     }
     printf("%d", sum);
     return 0;
}

某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全地区畅通需要的最低成本。

输入格式:

输入的第一行给出村庄数目N (1N100);随后的N(N1)/2行对应村庄间道路的成本及修建状态:每行给出4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态 — 1表示已建,0表示未建。

输出格式:

输出全省畅通需要的最低成本。

输入样例:

4
1 2 1 1
1 3 4 0
1 4 1 1
2 3 3 0
2 4 2 1
3 4 5 0

输出样例:

3

你可能感兴趣的:(数据结构)