hdu-2066 一个人的旅行

来源:互联网 发布:淘宝卖家怎么免费提现 编辑:程序博客网 时间:2024/05/16 11:50

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

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

 

#include<cstdio>#define N 1005#define INF 0xfffffffint 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;}


 

0 0