• poj2139 Floyd


    被dp虐哭。。。QAQ

    以后有机会专攻dp吧,太难受了

    开始图论专题

    ---------------------------------------------------------------分割线-------------------------------------------------------------

    题目大意:

      给你n个点(编号1~n)和m个集合,集合之内的点相互之间距离为1,若两个点通过第三个点连接,则其距离为2(如dis(a-b)=1,dis(b-c)=1,则dis(a-c)=2;),请你求出每个点到其他点的距离平均值最小值*100是多少(n<=300,m<=40000)

    解答:

      分析可知,这是多源最短路,又因为n<=300,所以用矩阵存图,n^3可过

      首先建图。。对于每个点集,点之间连线为1,至于间接相连距离为2则不必考虑,因为对于a,b,c三点,dis(a-b)=1,dis(b-c)=1,dis(a-c)=2,dis(a-c)=dis(a-b)+dis(b,c),所以不用联系起来

      然后就是直接floyd,最后对每个点到其他点距离计算sum/(n-1)即可

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<cstdio>
     6 using namespace std;
     7 int plat[333][333];
     8 int n,m,cnt;
     9 int cows[333],avg[333];
    10 const int inf=999;
    11 void add_edge(int m)
    12 {
    13     for(int i=1;i<=m;i++)
    14     {
    15         for(int j=1;j<=m;j++)
    16         {
    17             if(i==j) plat[cows[i]][cows[j]]=0;
    18             else plat[cows[i]][cows[j]]=1;
    19         }
    20     }
    21 }
    22 int main()
    23 {
    24     //freopen("in.txt","r",stdin);
    25     for(int i=0;i<333;i++) for(int j=0;j<333;j++) plat[i][j]=inf;
    26     scanf("%d %d",&n,&m);
    27     for(int i=1;i<=m;i++)
    28     {
    29         int N;
    30         scanf("%d",&N);
    31         for(int j=1;j<=N;j++) scanf("%d",&cows[j]);
    32         add_edge(N);
    33     }
    34     for(int k=1;k<=n;k++)
    35     {
    36         for(int i=1;i<=n;i++)
    37         {
    38             for(int j=1;j<=n;j++)
    39             {
    40                 if(plat[i][j]>plat[i][k]+plat[k][j])
    41                     plat[i][j]=plat[i][k]+plat[k][j];
    42             }
    43         }
    44     }
    45 
    46     int minn=9999999;
    47     for(int i=1;i<=n;i++)
    48     {
    49         double sum=0;
    50         for(int j=1;j<=n;j++)
    51         {
    52             //printf("%5d",plat[i][j]);
    53             sum+=plat[i][j];
    54         }
    55     //printf("
    ");
    56         //cout<<endl;
    57         avg[i]=sum*100/(n-1);
    58         minn=min(minn,avg[i]);
    59     }
    60     printf("%d",minn);
    61 }
    View Code
  • 相关阅读:
    HBuilder在线打包ipa步骤
    SWD烧录/仿真方式
    详解shell脚本括号区别--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]
    Centos/Linux下调整分区大小(以home和根分区为例)
    Centos6.5安装中文支持和中文输入法
    如何用电路实现检测过零点?这个简单电路就能搞定
    ifconfig无输出的原因及解决办法
    Linux云服务器下Tomcat部署
    linux wget 命令用法详解(附实例说明)
    yum的repo文件详解、以及epel简介、yum源的更换
  • 原文地址:https://www.cnblogs.com/codeoosacm/p/10035137.html
Copyright © 2020-2023  润新知