• 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
    ",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 ",Floyd()); } return 0; }


     

  • 相关阅读:
    Java代理模式精讲之静态代理,动态代理,CGLib代理
    Java文件编译与反编译:javac命令和javap命令
    CAS机制总结
    try-catch-finally 与返回值的修改
    不同分布式锁的实现
    缓存算法(页面置换算法)-FIFO、LFU、LRU
    多线程的线程开销
    谈谈如何来查看GC日志
    JVM中常见的垃圾收集器
    前端大牛 博客集
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7016164.html
Copyright © 2020-2023  润新知