hdu 2112 HDU Today (floyd算法)

时间:2021-05-03 01:05:20

这道题貌似在原来学长给我们的搞的小比赛中出过!

这次又让我遇到,果断拿下!

不过方法很蠢,跑了1000多ms,虽然要求5000ms以内!

题目就是给你一些位置之间的距离,然后再让你求特定的两点之间的距离!就是个样子滴!

只不过这道题更切合实际,给你的位置是字符串!

我的处理方法是将字符串转化为数字,数字不就是我们最熟悉的了吗!嘎嘎嘎···················

#include<stdio.h>

#include<string.h>
#define MAX 1000000000000

int main()

{

    __int64 map[200][200],i,j,k,n,m,r,t,s;

    char str[200][200],str1[200],str2[200];

    while(scanf("%I64d",&n)!=EOF&&n>0)

    {

        for(i=0;i<=190;i++)

            for(j=0;j<=190;j++)

                map[i][j]=MAX;

        scanf("%s %s",str1,str2);

        

        strcpy(str[0],str1);

        strcpy(str[1],str2);

        m=2;

        for(j=1;j<=n;j++)

        {

            scanf("%s %s %I64d",str1,str2,&s);

            for(i=0;i<m;i++)//转化的过程

                if(strcmp(str[i],str1)==0)

                {

                    r=i;break;

                }

                if(i==m)

                {

                    strcpy(str[m],str1);

                    r=m;

                    m++;

                }

                for(i=0;i<m;i++)

                    if(strcmp(str[i],str2)==0)

                    {

                        t=i;break;

                    }

                if(i==m)

                {

                    strcpy(str[m],str2);

                    t=m;

                    m++;

                }

                if(map[r][t]>s)

                {

                map[r][t]=s;

                map[t][r]=s;

                }

        }

        if(strcmp(str[0],str[1])==0)//特别注意,始点与终点相同的情况!这点使我wrong了几次!哎···,当知道这个特例时我将这个if语句放在前面了,结果还是wrong了,想了好久//才明白,原来是continue直接跳过了整个循环导致后面的内容输不进来了!囧!!!

        {

            printf("0\n");

            continue;

        }

        for(k=0;k<m;k++)

            for(i=0;i<m;i++)

                for(j=0;j<m;j++)

                    if(map[i][j]>map[i][k]+map[k][j])

                        map[i][j]=map[i][k]+map[k][j];

                    if(map[0][1]==MAX)

                        printf("-1\n");

                    else

                        printf("%I64d\n",map[0][1]);

    }

    return 0;

}

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112