0
点赞
收藏
分享

微信扫一扫

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

M4Y 2023-05-25 阅读 22


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

输入格式:

输入的第一行给出村庄数目N (1≤N≤100);随后的N(N−1)/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


#include <bits/stdc++.h>
using namespace std;
#define MAXLEN 10000
int Graph[110][110];
int pointnum, edgenum, closedge[110];
int minlength()
{
    int pos = -1, minedge = MAXLEN;
    for(int i = 1; i <= pointnum; ++i)
      if(closedge[i] < minedge && closedge[i] != -1)
    {
        pos = i;
        minedge = closedge[i];
    }
    return pos;

}
int prim()
{
    int nextpt, minedge = MAXLEN;
    int minprice = 0;
    for(int i = 1; i <= pointnum; ++i)
        closedge[i] = MAXLEN;
    closedge[1] = -1;
    for(int i = 2; i <= pointnum; ++i)
        closedge[i] = Graph[1][i];
    for(int i = 1; i < pointnum; ++i)
    {
        nextpt = minlength();
        if(nextpt != -1)
        {
        minprice += closedge[nextpt];
        closedge[nextpt] = -1;
        for(int j = 1; j <= pointnum; ++j)
        {
            if(Graph[nextpt][j] < closedge[j])
             closedge[j] = Graph[nextpt][j];
        }
        }
    }
    return minprice;
}
int main()
{
  int minprice;
  scanf("%d", &pointnum);
  edgenum = pointnum * (pointnum - 1) / 2;
  for(int i = 1; i <= pointnum; ++i)
    for(int j = 1; j <= pointnum; ++j)
      Graph[i][j] = MAXLEN;
  for(int i = 1; i <= edgenum; ++i)
  {
      int pos1, pos2, weight, flag;
      scanf("%d %d %d %d", &pos1, &pos2, &weight, &flag);
      if(flag == 1)
      {
         Graph[pos1][pos2] = 0;
         Graph[pos2][pos1] = 0;
      }
      else
      {
          Graph[pos1][pos2] = weight;
          Graph[pos2][pos1] = weight;
      }
  }
  minprice = prim();
  printf("%d", minprice);
}



举报

相关推荐

0 条评论