Problem-F

来源:互联网 发布:希腊失业率数据 编辑:程序博客网 时间:2024/04/27 22:34

概述:小岛上有一些路,这些路需要每年维护,然后因为维护金额太大,需要精简道路的长度,现在要求在连通的情况下最短,求精简后路程的长度。

思路:很明显的最短树问题,跟昨天ac的几道题类似,用prim算法,将输入的数据转换为邻接矩阵即可。

感想:类似昨天的题目,唯一的变化就是输入数据再度改变,所以只要将输入数据改成矩阵,核心prim代码完全不用改变就轻松ac。

#include<iostream>#include<string.h>#include<fstream>#include<stdio.h>#include<algorithm>#include<cmath>using namespace std;const int INF = 1 << 20;const int maxn = 30;int sign[maxn];int dis[maxn];int n, sum;int map[maxn][maxn];void prim(){sign[1] = 1;for (int i = 2;i <= n;i++){dis[i] = map[1][i];}int now, min;for (int i = 1;i < n;i++){min = INF;for (int j = 1;j <= n;j++)if (!sign[j] && dis[j] < min){min = dis[j];now = j;}sum += min;sign[now] = 1;for (int j = 1;j <= n;j++)if (!sign[j] && map[now][j] < dis[j])dis[j] = map[now][j];}}int main(){//ifstream cin("in.txt");char start[5], end[5];int x, y;while (cin >> n && n){memset(sign, 0, sizeof(sign));sum = 0;for (int i = 1;i<=n;i++)for (int j = 1;j<=i;j++)map[i][j] = map[j][i] = INF;for (int i = 1;i < n;i++){cin >> start >> x;while (x--){cin >> end >> y;if (y < map[start[0] - 'A'+1][end[0] - 'A'+1]){map[start[0] - 'A'+1][end[0] - 'A'+1] = map[end[0] - 'A'+1][start[0] - 'A'+1] = y;}}}prim();cout << sum << endl;}return 0;}


1 1