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\n",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\n",dist[n-1]);
    }
    return 0;
}
View Code

 

posted @ 2014-02-28 23:32  龚细军  阅读(374)  评论(0编辑  收藏  举报