zoukankan      html  css  js  c++  java
  • usaco2.4.3//图的连通性(floyd求)加floyd多源点最短路

    usaco2.4.3//图的连通性(floyd求)加floyd多源点最短路 
    //一开始以为只是两个牧场之间的(二分图),实际是存在多个联通图的,额
    //还有最重要的是不要以为所求的农场最大直径一定存在于新图建立之后,老图(没连上新边之前)也有可能存在最大直径,错了n久……
    View Code
    #include<stdio.h>
    #include
    <string.h>
    #include
    <math.h>
    #define MAX 0x7fffffff

    struct data
    {
    int x;
    int y;
    }p[
    155];

    int fen[155][155];
    int v[155];
    bool g[155][155];
    int yi[155],er[155],nyi,ner,n;
    double map[155][155],zui[155],maxmax;
    double dis(data a,data b)
    {
    double xx,yy,s;
    xx
    =a.x-b.x;
    yy
    =a.y-b.y;
    s
    =sqrt(xx*xx+yy*yy);
    return s;
    }

    void floyd()
    {
    int i,j,k;

    for(k=1;k<=n;k++)
    {
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=n;j++)
    {
    if(i!=j)
    if(map[i][j]>map[i][k]+map[k][j])
    map[i][j]
    =map[i][k]+map[k][j];
    }
    }
    }

    double max=0;maxmax=0;
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=n;j++)
    {
    if(map[i][j]!=MAX)
    {
    if(max<map[i][j])
    max
    =map[i][j];
    }
    }
    zui[i]
    =max;
    if(maxmax<zui[i])
    maxmax
    =zui[i];
    max
    =0;
    }
    }

    int main()
    {
    int i,j,k;
    char a[155];
    while(scanf("%d",&n)!=EOF)
    {
    for(i=1;i<=n;i++)
    {
    scanf(
    "%d%d",&p[i].x,&p[i].y);
    }
    getchar();
    for(i=1;i<=n;i++)
    {
    gets(a
    +1);
    for(j=1;j<=n;j++)
    {
    if(a[j]=='1')
    {
    map[i][j]
    =dis(p[i],p[j]);
    g[i][j]
    =1;
    }
    else
    {
    map[i][j]
    =MAX;
    g[i][j]
    =0;
    }
    }

    }

    for(k=1;k<=n;k++)
    {
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=n;j++)
    {
    if(g[i][j]==0&&g[i][k]==1&&g[k][j]==1)
    g[i][j]
    =1;
    }
    }
    }
    memset(v,
    0,sizeof(v));
    int rt,add;
    add
    =1;
    for(i=1;i<=n;i++)
    {
    if(v[i]==0)
    {
    for(j=1;j<=n;j++)
    {
    if(g[i][j]==1)
    v[j]
    =add;
    }
    v[i]
    =add;
    add
    ++;
    }
    }

    int chang=add-1,nei;
    add
    =1;

    for(i=1;i<=n;i++)
    {
    if(add==chang+1)break;
    nei
    =1;
    if(v[i]==add)
    {
    rt
    =0;
    for(j=1;j<=n;j++)
    {
    if(g[i][j]==1)
    {
    fen[add][nei]
    =j;
    rt
    =1;
    nei
    ++;
    }
    }
    fen[add][
    0]=nei-1;
    add
    ++;
    }
    if(rt==0)
    {
    fen[add
    -1][1]=i;
    fen[add
    -1][0]=1;
    }
    }


    floyd();

    int x,y,a,b;
    double zhi,minzhi=MAX;
    for(i=1;i<=chang;i++)
    {
    for(j=i+1;j<=chang;j++)
    {
    for(a=1;a<=fen[i][0];a++)
    {
    for(b=1;b<=fen[j][0];b++)
    {
    x
    =fen[i][a];
    y
    =fen[j][b];
    map[x][y]
    =dis(p[x],p[y]);
    zhi
    =zui[x]+zui[y]+map[x][y];
    if(minzhi>zhi)
    minzhi
    =zhi;
    }
    }
    }
    }
    if(maxmax<minzhi)
    printf(
    "%.6lf\n",minzhi);
    else
    printf(
    "%.6lf\n",maxmax);
    }
    }

  • 相关阅读:
    HDOJ 1015 Safecracker
    POJ3187 虽然超时了,但是还得纪念一下
    HDOJ 1248
    HDOJ 1161
    动态规划——砝码称重
    P01P02P03各种背包!!
    对基类与派生类对象和指针赋值的小结
    程序员技术练级攻略
    CodeForces 愚人节题目
    java入门
  • 原文地址:https://www.cnblogs.com/huhuuu/p/1954806.html
Copyright © 2011-2022 走看看