首页 > 代码库 > hdu-2066 一个人的旅行

hdu-2066 一个人的旅行

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

/*主要思路就是把小草家看做源点0,然后和小草家相近的城市到源点距离为0,这样就妥妥的变成了单源的dijkstra,就基本上是模板了。。。。。。。*/ 

 

#include<cstdio>
#define N 1005
#define INF 0xfffffff
int map[N][N],dis[N],vis[N],n;
void dijkstra()
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        dis[i]=map[0][i];//出发点到各个地点的距离
        vis[i]=false;//标记还没走
    }
    for(i=1;i<=n;i++)
    {
        int t=INF;
        int k;
        for(j=1;j<=n;j++)
        {
            if(!vis[j]&&t>dis[j])
            {
                t=dis[j];
                k=j;
            }
        }
        vis[k]=true;
        for(j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]>dis[k]+map[k][j])
                dis[j]=dis[k]+map[k][j];
        }
    }
    printf("%d\n",dis[n]);
}

int main()
{
    int t,s,d,i,j,k,a,b,c;
    while(scanf("%d%d%d",&t,&s,&d)!=EOF)
    {
        for(i=0;i<N;i++)
            for(j=0;j<N;j++)
            {
                map[i][j]=INF;
            }
        n=0;//统计有几个地方
        for(i=1;i<=t;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            if(c<map[a][b]) map[a][b]=map[b][a]=c;//保存路径的最小值,路径可能是双向 的,并且可能还有重复
            if(n<a) n=a;
            if(n<b) n=b;
        }
        n++;//注意,地方数加1,即到了终点
        for(i=0;i<s;i++)
        {
            scanf("%d",&a);
            map[0][a]=map[a][0]=0;//出发点都相邻城市时间为0
        }
        for(i=0;i<d;i++)
        {
            scanf("%d",&a);
            map[a][n]=map[n][a]=0;//终点到想去的地方路径长度为0
        }
        dijkstra();
    }
    return 0;
}


 

// Floyd
#include "stdio.h"
#include "string.h"
const int inf = 1000000;
int map[1115][1115];
int max_city;
bool mark1[1005],mark2[1005];
int Floyd()
{
    int temp=inf;
    for( int k=1;k<=max_city;k++ )
    {
        for( int i=1;i<=max_city;i++ )
        {
            if( map[i][k]!=inf )
                for( int j=1;j<=max_city;j++ )
                {
                    if( map[i][j] > map[i][k] + map[k][j] )
                    {
                        map[i][j] = map[i][k] + map[k][j];
                    }
                    if( mark1[i] && mark2[j] )
                            temp=temp<map[i][j]?temp:map[i][j];
                }
        }
    }
    return temp;
}
int main()
{
    int t,s,d,a,b,c,i,j,temp;
    while( scanf("%d%d%d",&t,&s,&d)==3 )
    {
        for( i=0;i<1005;i++ )
            for( j=i+1;j<=1005;j++ )
                map[i][j]= map[j][i] = inf;
        max_city=0;
        for( i=0;i<t;i++ )
        {
            scanf("%d%d%d",&a,&b,&c);
            if( map[a][b]>c )
                map[a][b]=map[b][a]=c;
            max_city=(a>b ? a:b) > max_city ? (a>b?a:b) : max_city;
        }
        memset(mark1,0,sizeof(mark1));
        memset(mark2,0,sizeof(mark2));
        for( i=0;i<s;i++ )
        {
            scanf("%d",&temp);
            mark1[temp]=true;
        }
        for( i=0;i<d;i++ )
        {
            scanf("%d",&temp);
            mark2[temp]=true;
        }
        printf("%d\n",Floyd());
    }
    return 0;
}