• HDUOJ --2544最短路(基础)


    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
    输入保证至少存在1条商店到赛场的路线。
     
    Output
    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     
    Sample Input
    2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
     
    Sample Output
    3 2
     
    Source
     

     代码:基于数组(时间复杂度为O(n^2))

     1 #include<stdio.h>
     2 #include<string.h>
     3 const int inf=0x3f3f3f3f ;
     4 int path[101];
     5 int sta[101][101],lowcost[101];
     6 void Dijkstra( int cost[][101], int n )
     7 {
     8     int i,j,min;
     9     int vis[101]={1};
    10     for(i=0; i<n ; i++)
    11     {
    12         lowcost[i]=cost[0][i];
    13         path[i]=0;
    14     }
    15     lowcost[0]=0;
    16     path[0]=-1;  
    17     int pre= 0;
    18     for( i=1 ; i<n ;i++)
    19     {
    20         min=inf;
    21         for(j=0 ; j<n ;j++)
    22         {
    23             if(vis[j]==0&&lowcost[pre]+cost[pre][j]<lowcost[j])
    24             {
    25                 lowcost[j]=lowcost[pre]+cost[pre][j];
    26                 path[j]=pre;
    27             }
    28         }
    29         for(j=0; j<n ;j++)
    30         {
    31             if(vis[j]==0&&lowcost[j]<min)
    32             {
    33                 min=lowcost[j];
    34                 pre=j;
    35             }
    36         }
    37         vis[pre]=1;
    38     }
    39    printf("%d
    ",lowcost[n-1]);
    40 }
    41 
    42 int main()
    43 {
    44     int n,m,x,y,val,i,j;
    45     while(scanf("%d%d",&n,&m),n+m)
    46     {
    47         for(i=0;i<n;i++)
    48         {
    49             for(j=0;j<n;j++)
    50             {
    51                 sta[i][j]=inf;
    52             }
    53         }
    54         while(m--)
    55         {
    56             scanf("%d%d%d",&x,&y,&val);
    57             sta[y-1][x-1]=sta[x-1][y-1]=val;
    58         }
    59         Dijkstra(sta,n);
    60     }
    61     return 0;
    62 }
    View Code

     采用以为数组,时间复杂度将为O(n*long(n));

    代码:

    #include<iostream>
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    const int inf=0x3f3f3f3f;
    const int tol=101;
    const int edg=10001;
    int cost[edg],dist[tol];   /* <distance> */
    int e,pnt[edg],nxt[edg],prev[tol],head[tol],vis[tol];
    struct qnode{
            int v ,c;
            qnode(int vv=0 ,int cc=0):v(vv),c(cc){};
            bool operator <(const qnode&  r)const 
            {
                return c>r.c;
            }
    };
    
    void Dijkstra(int n , const int src)  /*  <src出发点> */
    {
        qnode mv ;    //充当一个临时变量
        int i,j,k,pre;
        priority_queue<qnode>que ;  /*<priority—>优先队列>*/
        vis[src]=1;
        dist[src]=0;
        que.push( qnode(src,0) );
        for( pre=src,i=1; i<n; i++)
        {
            for(j=head[pre] ; j!=-1 ;j=nxt[j])
            {
                k=pnt[j];
                if(vis[k]==0&&dist[pre]+cost[j]<dist[k])
                {
                    dist[k]=dist[pre]+cost[j];
                    que.push( qnode(pnt[j], dist[k]) );
                    prev[k]=pre;
                }
            }
            while(!que.empty() && vis[que.top().v]==1)
            {
                que.pop();
            }
            if(que.empty())break;
            mv=que.top();
            que.pop();
            pre=mv.v;
            vis[pre]=1;
        }
    }
        inline void addedge( int u ,int v,int c)
        {
            pnt[e]=v;
            cost[e]=c;
            nxt[e]=head[u];
            head[u]=e++;
    
        }
    
    void init(int nv ,int ne)
    {
        int i,u,v;
        int c;
        e=0;
        memset(head,-1,sizeof(head));
        memset(vis,0,sizeof(vis));
        memset(prev,-1,sizeof(prev));
        for(i=0; i<nv ; i++)
            dist[i]=inf;
        for(i=0; i<ne ;i++)
            {
                scanf("%d%d%d",&u,&v,&c); 
                addedge(u-1,v-1,c);
                addedge(v-1,u-1,c);
            }
        
    }
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m),n+m)
        {
            init(n,m);
            Dijkstra(n,0);
            printf("%d
    ",dist[n-1]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    根据租户id获取部门树状结构有父子结构的数据list
    JAVA 中 Map 与实体类相互转换的简单方法
    JAVA 实体类List<Entity >转 List<Map>
    在eclipse中怎样查找一个类中的方法在其他哪个类中被调用了?快捷键是什么?
    eclipse项目包层级显示方式调整
    怎样查看JDK是32位还是64位
    python 面向对象专题(十三):元类(二): metaclass魔术方法
    python 面向对象专题(十二):元类(一): metaclass概述
    Hive高级(7):优化(7) 数据倾斜问题剖析
    数据可视化基础专题(二十七):numpy80题(六)NumPy进阶修炼第四期|NumPy最后二十问
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3574556.html
Copyright © 2020-2023  润新知