zoukankan      html  css  js  c++  java
  • 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; }


     

  • 相关阅读:
    Oracle之PL/SQL学习笔记
    Git常用命令
    Web前端上万字的知识总结
    Objective-C中小怪兽的逻辑
    PHP精选数组函数
    数据库连接字符串方法
    WM_CAP_DRIVER_CONNECT
    GB2312/ANSI编码转中文字符
    opencv播放不了AVI视频的问题
    我的MFC/C++学习笔记 http://blog.bccn.net/CrystalFan/6909
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7016165.html
Copyright © 2011-2022 走看看