您的位置:首页 > 其它

一个人的旅行

2015-05-03 10:38 239 查看

http://acm.hdu.edu.cn/showproblem.php?pid=2066

//floyd

#include<stdio.h>

#include<string.h>

int e[1010][1010],start[1010],end[1010];

int main()

{

 int aa,time,a,b,t,s,d,i,j,k,inf=99999999,min,n;

 while(scanf("%d%d%d",&t,&s,&d)!=EOF)

 {

  for(i=1;i<=1000;i++)

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

    if(i==j)

     e[i][j]=0;

    else

     e[i][j]=inf;

  n=0;

  for(i=1,j=1;i<=t;i++)

  {

   scanf("%d%d%d",&a,&b,&time);

   if(a>n)

    n=a;

   if(b>n)

    n=b;

   if(e[a][b]>time)

   {

    e[a][b]=time;

    e[b][a]=time;

   }

  }

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

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

   {

    if(e[j][i]==inf)

     continue;

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

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

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

   }

  for(i=1;i<=s;i++)

   scanf("%d",start+i);

  for(i=1;i<=d;i++)

   scanf("%d",end+i);

  min=inf;

  for(i=1;i<=s;i++)

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

    if(e[start[i]][end[j]]<min)

     min=e[start[i]][end[j]];

  printf("%d\n",min);

 }

 return 0;

}

////////////////////////////////////////////////////////////

floyd1

#include<stdio.h>

#include<string.h>

int e[1010][1010],start[1010],end[1010],sign1[1010];

int main()

{

    int time,a,b,t,s,d,i,j,k,inf=99999999,min,n,temp,j1,j2;

    while(scanf("%d%d%d",&t,&s,&d)!=EOF)

    {

        for(i=1;i<=1000;i++)

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

                if(i==j)

                    e[i][j]=0;

                else

                    e[i][j]=inf;

        memset(sign1,0,sizeof(sign1));

        for(i=1,j=1;i<=t;i++)

        {

            scanf("%d%d%d",&a,&b,&time);

            if(!sign1[a])

            sign1[a]=j++;

            if(!sign1[b])

            sign1[b]=j++;

            if(e[sign1[a]][sign1[b]]>time)

            {

                e[sign1[a]][sign1[b]]=time;

                e[sign1[b]][sign1[a]]=time;

            }

        }

        n=j-1;

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

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

   {

    if(e[j][i]==inf)

     continue;

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

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

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

   }

        for(i=1,j1=1;i<=s;i++)

  {

            scanf("%d",&temp);

   if(sign1[temp]!=0)

    start[j1++]=temp;

  }

        for(i=1,j2=1;i<=d;i++)

  {

            scanf("%d",&temp);

   if(sign1[temp]!=0)

    end[j2++]=temp;

  }

        min=inf;

        for(i=1;i<j1;i++)

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

                if(e[sign1[start[i]]][sign1[end[j]]]<min)

                    min=e[sign1[start[i]]][sign1[end[j]]];

        printf("%d\n",min);

    }

    return 0;

}

////////////////////////////////////////////////////////////////////////////////

Dijkstra

#include<stdio.h>

#include<string.h>

int vis[1010],e[1010][1010],start[1010],end[1010],dis[1010];

int main()

{

 int a,b,time,t,s,d,i,j,k,n,min,inf=99999999,u,mmin;

 while(scanf("%d%d%d",&t,&s,&d)!=EOF)

 {

  for(i=1;i<=1000;i++)

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

    if(i==j)

     e[i][j]=0;

    else

     e[i][j]=inf;

  n=0;

  for(i=1;i<=t;i++)

  {

   scanf("%d%d%d",&a,&b,&time);

   if(a>n)

    n=a;

   if(b>n)

    n=b;

   if(time<e[a][b])

   {

    e[a][b]=time;

    e[b][a]=time;

   }

  }

  for(i=1;i<=s;i++)

   scanf("%d",start+i);

  for(i=1;i<=d;i++)

   scanf("%d",end+i);

  mmin=inf;

  for(i=1;i<=s;i++)

  {

   memset(vis,0,sizeof(vis));

   vis[start[i]]=1;

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

    dis[j]=e[start[i]][j];

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

   {

    min=inf;

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

     if(!vis[k] && dis[k]<min)

     {

      min=inf;

      u=k;

     }

    vis[u]=1;

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

     if(dis[k]>dis[u]+e[u][k])

      dis[k]=dis[u]+e[u][k];

   }

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

    if(dis[end[j]]<mmin)

     mmin=dis[end[j]];

  }

  printf("%d\n",mmin);

 }

 return 0;

}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: