• 安徽省2016“京胜杯”程序设计大赛_H_单身晚会


    单身晚会

    Time Limit: 1000 MS Memory Limit: 65536 KB
    Total Submissions: 53 Accepted: 16

    Description


    ​ZJ和ZCX在一起很久了,两个人都互生爱意,最终决定喜结良缘,从此踏入浪漫的婚姻殿堂。

    但是,ZJ的好基友们想到以后ZJ就不能经常跟他们一起愉快的玩耍了,都觉得非常伤心难过,于是他们决定在最后一晚为ZJ开一场单身晚会,玩整晚紧张刺激的飞行棋。

    ZJ的好基友居住在城市的各个地方(每个地方不一定只有一个基友),他们需要从各个地方赶到其中一个朋友的家里来参加这最后的单身PARTY,ZJ被基友们的热情深深感动了,决定对基友们来时的路费进行报销。报销规则按照距离来计算。基友们为了帮ZJ省钱,决定在所有人走最短路径的情况下,总距离最小的人的家里开PARTY。

    ZJ想知道基友们走过的总距离是多少,然后他把总共需要报销的钱拿出来,就可以让基友们自己来分配了。但是他算了半天也没算出来总距离是多少,单身PARTY马上就开始了,你能帮帮他吗?



    Input


             第一行一个整数T,表示有T(T<15)组数据

    每组数据的第一行基友数(包括ZJ)N(N<100),路口P(2<=P<=100),路口之间道路数C(1<=C<=1450),(基友的编号为1…N,路口的编号为1…P)

    第二行到第N+1行:编号为1到N的基友们家所在的路口号。

    第N+2行到N+C+1行:每行有三个数:相连的路口A,B,路口间间距D(1<=D<=255),当然,连接是双向的。


    Output


    每组数据输出占一行,输出大家必须要走的最小距离和


    Sample Input


    1
    3 4 5
    2
    3
    4
    1 2 1
    1 3 5
    2 3 7
    2 4 3
    3 4 5

    Sample Output


    8

    Hint


    经测试,本题数据和题意不符合,现对题意做如下修正:
    选择一个路口(不一定要有人住),使所有人到这个路口的路程和最小化
    这题应该是省赛现场修改题意,但这里用的是原题意,特此说明。对被卡的同学再次表示歉意。对其他题目有疑义的可以发信件给账号instankill询问。

    这道题在省赛中改过题意,重新A时发现自己很多次也提交不过,感觉Hint的注意也写的不是很清晰。
    题解:这道题是典型的利用Floyd算法求最短路径的问题,有关Floyd算法此处省略,网上有很多,介绍的也很详细。先利用Floyd算法求出任意两个路口的最短路径。最后求任意一个路口到所有基友的距离之和,最后找到最小值,也就是在路口也是可以开party的。一开始也是没明白题意,理解成要在基友家里开party,所以老是Wrong Answer。只要注意这点应该就没有问题了

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    typedef long long LL;
    const LL INF = 1000000000;
    
    using namespace std;
    
    int a[101];
    LL L[101][101];
    int n, p, c;
    
    void floyd() //Floyd最短路径算法
    {
        for (int k=1; k<=p; k++)
            for (int i=1; i<=p; i++)
                for (int j=1; j<=p; j++)
                    L[i][j] = min(L[i][j], L[i][k]+L[k][j]);
    }
    
    int main()
    {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            scanf("%d%d%d", &n, &p, &c);
            for (int i=1; i<=n; i++)
                scanf("%d", &a[i]);
            int A, B, D;
            for (int i=1; i<=p; i++)
                for (int j=1; j<=p; j++)
                    L[i][j] = INF;
            for (int i=1; i<=p; i++)
                L[i][i] = 0;
            for (int i=0; i<c; i++) {
                scanf("%d%d%d", &A, &B, &D);
                L[A][B] = D;
                L[B][A] = D;
            }
            floyd();
            LL Smin = INF, s = 0;
            for (int i=1; i<=p; i++) {
                s = 0;
                for (int j=1; j<=n; j++) {
                    if (L[i][a[j]] >= INF) //先排除无穷大的边
                        goto to; //出现就进入下一次循环
                    s += L[i][a[j]];
                }
                Smin = min(Smin, s); //求出每次的最短路径
                to:;
            }
            printf("%d
    ", Smin);
        }
        return 0;
    }
    



  • 相关阅读:
    12月14日 bs-grid , destroy_all()
    12月13日 什么是help_method,session的简单理解, find_by等finder method
    12月10日 render( locals:{...}) 传入本地变量。
    12月8日 周五 image_tag.
    12月7日,几个错误,拼写错误,遗漏符号:,记忆有误,max-width的作用。gem mini_magick, simple_form
    程序员必读之软件架构
    先进PID控制MATLAB仿真(第4版)
    中文版Illustrator CS6基础培训教程(第2版)
    Android系统级深入开发——移植与调试
    Excel在会计与财务管理中的应用
  • 原文地址:https://www.cnblogs.com/fayne/p/7224797.html
Copyright © 2020-2023  润新知