• E


    题意:在一个叫做QS的星系,他们使用一些特殊的通讯方式,两个人之间通讯需要使用一个网络适配器,但是一个网络适配器只能跟一个人联系,所有它连接几个人就需要及格适配器,而且每个人都有一些不同的偏好,喜欢的适配器的牌子也是不同的,现在让你求出来让QS人之间相互通讯最少需要多少代价?
    输入第一行是测试数据组数,下面是一个N,代表N个人,下一样有N个数表示每个人喜欢的适配器的价格,接着一个矩阵,表示两点间通讯(电缆??)的价格。

    分析:只要在每条边的权值上加上两个适配器的价格就可以了。
    *******************************************************************
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    #include<math.h>
    #include<vector>
    using namespace std;

    #define maxn 1005

    int f[maxn], val[maxn];
    struct node
    {
        int u, v, len;
        friend bool operator < (node a, node b)
        {
            return a.len > b.len;
        }
    };
    int Find(int x)
    {
        if(f[x] != x)
            f[x] = Find(f[x]);
        return f[x];
    }

    int main()
    {
        int T;

        scanf("%d", &T);

        while(T--)
        {
            int N, u, v;
            node s;
            priority_queue<node> Q;

            scanf("%d", &N);

            for(int i=1; i<=N; i++)
            {
                scanf("%d", &val[i]);
                f[i] = i;
            }

            for(s.u=1; s.u<=N; s.u++)
            for(s.v=1; s.v<=N; s.v++)
            {
                scanf("%d", &s.len);
                s.len += val[s.u]+val[s.v];
                Q.push(s);
            }

            int ans = 0;

            while(Q.size())
            {
                s = Q.top();Q.pop();
                u = Find(s.u), v = Find(s.v);

                if(u != v)
                {
                    f[u] = v;
                    ans += s.len;
                }
            }

            printf("%d ", ans);
        }

        return 0;
    }
  • 相关阅读:
    linux 查看 服务 命令
    Java Swing中键盘事件的处理(转)
    VI常用命令及快捷键(转)
    Linux source用法(转)
    无线桥接 WDS 中继(转)
    在远程桌面连接中使用任务管理器(转)
    linux 运行 级别(转)
    linux 当前用户 命令 w who(转)
    vecket适合和不适合的10种人(转)
    在查找预编译头使用时跳过解决(转)
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4674490.html
Copyright © 2020-2023  润新知