zoukankan      html  css  js  c++  java
  • poj1125

    不得不说,这道提让我懂了很多,第一次知道memset初始化是按字节初始化的

    这道题用自己的方法A了以后,发现discuss里面都说用floyd,然后决定用floyd A一次

    应该是数据太水了 两个都是0Ms  400k左右

    两个程序不同之处也就是找最短路径时不一样

    一个floyd的教程:http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html

    我自己想的方法

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int dp[150][150],loc[150][150],used[150],out[150];
    void dp1(int i,int n,int value,int st)//第i个到n-1个点最短距离,
    {
    int i1,temp,i2,tval;


    for(i1=0;i1<n;i1++)
    {
    if(loc[i][i1]!=-1&&used[i1]==0)
    {

    if(out[i1]!=1)
    {
    used[i1]=1;
    temp=loc[i][i1]+value;
    if(temp<dp[st][i1])
    {
    dp[st][i1]=temp;
    }
    dp1(i1,n,dp[st][i1],st);
    used[i1]=0;
    }
    else
    {
    temp=loc[i][i1]+value;
    if(temp<dp[st][i1])
    {
    dp[st][i1]=temp;
    }
    for(i2=0;i2<n;i2++)
    {
    if(dp[i1][i2]<10000&&i2!=st)//
    {
    temp=dp[st][i1]+dp[i1][i2];
    if(temp<dp[st][i2])
    {

    dp[st][i2]=temp;
    }
    }
    }
    }



    }
    }




    for(i2=0;i2<n;i2++)
    {
    if(dp[i][i2]<10000)//&&i2!=st
    {
    temp=value+dp[i][i2];
    if(temp<dp[st][i2])
    {

    dp[st][i2]=temp;
    }
    }
    }


    }
    int main(int argc, char** argv) {
    int n,num,a,b,i,i1,max,min,flag,f;
    while(scanf("%d",&n)&&n!=0)
    {
    flag=-1;
    memset(out,0,sizeof(out));
    for(i=0;i<n;i++)
    {
    for(i1=0;i1<n;i1++)
    {
    loc[i][i1]=-1;
    }
    }
    for(i=0;i<n;i++)
    {
    for(i1=0;i1<n;i1++)
    {
    dp[i][i1]=10005;
    }
    }
    for(i=0;i<n;i++)
    {
    used[i]=0;
    }

    for(i=0;i<n;i++)
    {
    scanf("%d",&num);
    for(i1=0;i1<num;i1++)
    {
    scanf("%d %d",&a,&b);
    loc[i][a-1]=b;
    }
    }

    for(i=0;i<n;i++)
    {
    used[i]=1;
    dp1(i,n,0,i);
    used[i]=0;
    out[i]=1;
    }
    min=10009;

    for(i=0;i<n;i++)
    {
    max=0;
    f=0;
    for(i1=0;i1<n;i1++)
    {
    if(dp[i][i1]<10001)
    {
    ++f;
    if(dp[i][i1]>max)
    {
    max=dp[i][i1];
    }

    }
    }
    if(min>max&&f==n-1)
    {
    min=max;
    flag=i;
    }

    }
    if(flag==-1)
    {
    printf("disjoint\n");
    }
    else
    {
    printf("%d %d\n",flag+1,min);
    }
    for(i=0;i<n;i++)
    {
    printf("\n");
    for(i1=0;i1<n;i1++)
    {
    printf("%d ",dp[i][i1]);
    }
    }



    }
    return (EXIT_SUCCESS);
    }

    Floyd:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main(int argc, char** argv) {

    int n,num,a,b,i,j,k,i1,i2,max,min,flag,f;
    int loc[101][101];
    while(scanf("%d",&n)&&n!=0)
    {
    memset(loc,-1,sizeof(loc));
    for(i=0;i<n;++i)
    {
    scanf("%d",&num);
    for(i1=0;i1<num;++i1)
    {
    scanf("%d %d",&a,&b);
    loc[i][a-1]=b;


    }
    }
    for(k=0;k<n;++k)
    for(i=0;i<n;++i)
    for(j=0;j<n;++j)
    {
    if(loc[i][k]!=-1&&loc[k][j]!=-1&&k!=i&&k!=j&&i!=j)
    {
    if(loc[i][j]==-1||loc[i][j]>loc[i][k]+loc[k][j])
    {
    loc[i][j]=loc[i][k]+loc[k][j];
    }
    }
    }


    flag=-1;
    min=10001;
    for(i=0;i<n;++i)
    {
    max=-1;

    f=0;
    for(j=0;j<n;++j)
    {
    if(loc[i][j]!=-1)
    {
    ++f;
    if(max<loc[i][j])
    {
    max=loc[i][j];

    }
    }
    }
    if(f==n-1&&min>max)
    {
    min=max;
    flag=i;
    }

    }
    if(flag==-1)
    {
    printf("disjoint\n");
    }
    else
    {
    printf("%d %d\n",flag+1,min);
    }
    /*for(i=0;i<n;++i)
    {
    printf("\n");
    for(j=0;j<n;j++)
    {
    printf("%d ",loc[i][j]);
    }
    }
    */
    }
    return (EXIT_SUCCESS);
    }




  • 相关阅读:
    D1
    测试 Collectors 类中相关 API,以及 Collector 接口中 Characteristics 的枚举值
    Servlet 整合 freemarker、如何在 freemarker 中自定义标签
    webLogic javaweb 路径问题 Not allowed to load local resource
    高复用、高兼容的 ajaxForm 上传文件
    Extjs 4+ 中的 combobox 的级联
    Echarts中关于雷达图极坐标值相差过大时的图像展示问题
    java 使用poi操作Excel(2003,2007)实现数据批量导入的一般思路
    java 使用poi操作Excel表格(2003,2007)实现数据的批量导出
    Ext3.4 表格基本操作
  • 原文地址:https://www.cnblogs.com/fengyuehan/p/poj1125.html
Copyright © 2011-2022 走看看