zoukankan      html  css  js  c++  java
  • 数据结构与算法题目集(中文)7-50 畅通工程之局部最小花费问题 (35分) (普利姆最小生成树)

    1.题目

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

    输入格式:

    输入的第一行给出村庄数目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

    2.题目分析

    Prim算法,已经建成的路径距离为0

    注意普利姆算法的基本实现

    3.代码

    #include<iostream>
    using namespace std;
    #define INF 100000
    #define max 109
    typedef struct
    {
    	int n, m;
    
    	int edges[max][max];
    }MGraph;
    int visited[max] = { 0 };
    int prim(MGraph g)
    {
    	int lowcost[max];
    	int mincost;
    	int  i, j, k;
    	int allcount = 0;
    	lowcost[1] = 0;
    	visited[1] = 1;
    	for (i = 1; i <=g.n; i++)
    	{
    		lowcost[i] = g.edges[1][i];
    	}
    	for (i = 2; i <= g.n; i++)//循环次数为节点数减一,每次找到未访问的节点,看能否将距离更新,如果循环次数再多一个就会导致if (k == -1)return -1;
    	{
    		mincost = INF;
    		k = -1;
    		for (j = 1; j <= g.n; j++)
    		{
    			if (visited[j]==0 && lowcost[j] < mincost)
    			{
    				mincost = lowcost[j];
    				k = j;
    			}
    		}
    		if (k == -1)return -1;
    		allcount += mincost;
    		visited[k] = 1;
    		for (j = 1; j <= g.n; j++)
    		{
    			if (visited[j]==0 && g.edges[k][j] < lowcost[j])
    			{
    				lowcost[j] = g.edges[k][j];
    			}
    		}
    
    	}
    	return allcount;
    }
    
    int  main()
    {
    	MGraph g;
    	cin >> g.n ;
    	g.m = g.n*(g.n - 1) / 2;
    	for (int i = 0; i < max; i++)
    	{
    		for (int j = 0; j < max; j++)
    		{
    			g.edges[i][j] = INF;
    		}
    	}
    	for (int i = 0; i < g.m; i++)
    	{
    		int a, b, c,d;
    		cin >> a >> b >> c>>d;
    		if (d == 0)
    		{
    			g.edges[a][b] = c;
    			g.edges[b][a] = c;
    		}
    		else
    		{
    			g.edges[a][b] = 0;
    			g.edges[b][a] = 0	;
    		}
    
    	}
    
    
    	cout << prim(g);
    }
  • 相关阅读:
    闰年测试
    EditBox的测试用例设计
    测试工程中的评审
    测试框架
    github
    第一次上机实验
    对软件测试的初步认识
    白盒测试
    Date : 日期对象
    C++ 格式化输出 及 输入 流
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788991.html
Copyright © 2011-2022 走看看