SDUT 2929 人活着系列之芳姐和芳姐的猪

来源:互联网 发布:windows 加域 编辑:程序博客网 时间:2024/04/28 13:37

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2929

人活着系列之芳姐和芳姐的猪

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

芳姐特别喜欢猪,所以,她特意养了m个猪圈,顺便在k条无向边,每条边有都有起点v,距离.....芳姐和猪们约定好,每天去一个固定猪圈去吃饭,芳姐为了不累着她可爱的猪们,想知道所有的猪吃饭走的最短路程是多少?

输入

 第一行,猪的个数mk(1<=k<=1200).(猪的编号为1..m)

N+1N头猪所在的猪圈号n+k+1行:u1<=w<=255)

m个猪圈连通。

输出

 

示例输入

3 4 52341 2 11 3 52 3 72 4 33 4 5

示例输出

8
标配版Floyd算法代码如下:

view plaincopyprint如果您复制代码时出现行号,请点击左边的“view plain”后再复制
  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cstring>  
  4. #include <algorithm>  
  5. using namespace std;  
  6. int main()  
  7. {  
  8.     int n, m, k;  
  9.     while(~scanf("%d %d %d", &n, &m, &k))  
  10.     {  
  11.         int a[1200+5][1200+5], b[1000+5];  
  12.         for(int i=0;i<=m;i++)  
  13.             for(int j=0;j<=m;j++)  
  14.             if(i==j) a[i][j]=0;  
  15.             else a[i][j]=0x3f3f3f3f;  
  16.         for(int i=1;i<=n;i++)  
  17.             scanf("%d", &b[i]);  
  18.         for(int i=1;i<=k;i++)  
  19.         {  
  20.             int u, v, w;  
  21.             scanf("%d %d %d", &u, &v, &w);  
  22.             if(a[u][v]>w)  
  23.                 a[u][v]=a[v][u]=w;  
  24.         }  
  25.         for(int k=1;k<=m;k++)  
  26.            for(int i=1;i<=m;i++)  
  27.             for(int j=1;j<=m;j++)  
  28.                 if(a[i][j]>a[i][k]+a[k][j])  
  29.                    a[i][j]=a[i][k]+a[k][j];  
  30. //        for(int i=1;i<=m;i++)  
  31. //        {  
  32. //            for(int j=1;j<m;j++)  
  33. //                printf("%d ", a[i][j]);  
  34. //            printf("%d\n", a[i][m]);  
  35. //        }  
  36.         int min=0x3f3f3f3f;  
  37.         for(int i=1;i<=m;i++)  //1到m为猪圈编号
  38.         {  
  39.             int sum=0;  
  40.             for(int j=1;j<=n;j++)  
  41.                 sum+=a[i][b[j]];  
  42.             if(sum<min) min=sum; //sum记录在第i个猪圈投食的话所有的猪走的路程和
  43.         }  
  44.         printf("%d\n", min);  //输出最小值
  45.   
  46.     }  
  47.     return 0;  
  48. }  

0 0