zoukankan      html  css  js  c++  java
  • 初学算法之dijkstra

      dijkstra的代码思想网上各路高手所述备矣。这里只是存下用邻接矩阵和邻接表实现的dijkstra。(白书代码)

      邻接矩阵

     1 void dijkstra(int s){
     2     int dis[s]=0;
     3     while(1){
     4         int v=0;  //从尚未使用过的顶点中选择一个距离最小的顶点 
     5         for(int u=1;u<=n;u++){
     6             if(!used[u]&&dis[v]>dis[u])
     7             v=u;
     8         }
     9         if(!v) break;
    10         used[v]=1;
    11         for(int u=1;u<=n;u++){
    12             dis[u]=min(dis[u],dis[v]+dis[v][u]);
    13         }
    14     }
    15 }
    View Code

        堆优化的dijkstra

     1 struct edge{int to,cost;};
     2 typedef pair<int ,int > P;
     3 
     4 int V;
     5 vector<int>G[Max];
     6 int d[Max];
     7 
     8 void dijkstra(int s){
     9     priority_queue<P>,vector<P>,greater<P> >que;//通过指定greater<P>参数 
    10     que.push(P(0,s));                             //堆按照first从小到大的顺序取出值 
    11     
    12     while(!que.empty()){
    13         P p=que.top();que.pop();
    14         int v=p.second;
    15         if(d[v]<p.first) continue;
    16         for(int i=0;i<G[v].size();i++){
    17             edge e=G[v][i];
    18             if(d[e.to]>d[v]+e.cost){
    19                 d[e.to]=d[v]+e.cost;
    20                 que.push(P(d[e.to],e.to));
    21             }
    22         }
    23     }
    24 } 
    25     
    26     
    View Code

    例题:hdu-2544 最短路

    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

    Input输入包括多组数据。每组数据第一行是两个整数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

    这题就是单纯的套模板
    附本人堆优化dijkstra的ac代码
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 #include <vector>
     5 const int Max = 111111;
     6 const int inf = 0x3f3f3f3f;
     7 using namespace std;
     8 struct edge{int to,cost;};
     9 vector<edge>G[Max];
    10 int d[Max];
    11 typedef pair<int,int>P;
    12 void dijkstra(){
    13     priority_queue<P,vector<P>,greater<P> >que;
    14     d[0]=0;
    15     que.push(P(0,0));
    16     while(!que.empty()){
    17         P p=que.top();que.pop();
    18 //        printf("%d ",p.first);
    19         int v=p.second;
    20         if(d[v]<p.first) continue;
    21         for(int i=0;i<G[v].size();i++){
    22             edge e=G[v][i];
    23             if(d[e.to]>d[v]+e.cost){
    24 //                printf("%d ",d[e.to]);
    25                 d[e.to]=d[v]+e.cost;
    26                 que.push(P(d[e.to],e.to));
    27             }
    28         }
    29     }
    30 }        
    31 int main(){
    32     int n,m;
    33     while(~scanf("%d %d",&n,&m),n+m){
    34         memset(d,inf,sizeof(d));
    35         int a,b,c;
    36         for(int i=0;i<m;i++){
    37             scanf("%d %d %d",&a,&b,&c);
    38             a-=1;
    39             b-=1;
    40             edge e;
    41             e.to=b;e.cost=c;
    42             G[a].push_back(e);
    43             e.to=a;
    44             G[b].push_back(e);
    45         }
    46         dijkstra();
    47         printf("%d
    ",d[n-1]);
    48         for(int i=0;i<m;i++)
    49         G[i].clear();
    50     }
    51     return 0;
    52 }
    View Code
    附本人邻接矩阵的ac代码
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<vector>
     4 #include<algorithm>
     5 #include<iostream>
     6 #include<queue>
     7 
     8 using namespace std;
     9 
    10 const int inf = 0x3f3f3f3f;
    11 
    12 int mp[105][105],dis[105],used[105],n;
    13 
    14 void dijkstra(){
    15     for(int i=1;i<=n;i++){
    16         dis[i]=mp[1][i];
    17     }
    18 //    for(int i=1;i<=n;i++)
    19 //            cout << mp[1][i] <<endl;
    20     dis[1]=0;
    21     used[1]=1;
    22     while(1){
    23         int minn=inf,u=-1;
    24         for(int i=1;i<=n;i++){
    25             if(minn>dis[i]&&used[i]==0){
    26                 minn=dis[i];
    27                 u=i;
    28             }
    29         }
    30         used[u]=1;
    31         if(u==-1)    break;
    32         for(int i=1;i<=n;i++){
    33             int temp=min(inf,dis[u]+mp[u][i]);
    34             if(dis[i]>temp){
    35                 dis[i]=temp;
    36             }
    37         }
    38     }
    39 }
    40 int main(){
    41     ios::sync_with_stdio(false);
    42     int m,i,j,a,b,c;
    43     while(cin >> n >> m,n||m){
    44         memset(dis,0,sizeof(dis));
    45         memset(mp,inf,sizeof(mp));
    46         memset(used,0,sizeof(used));
    47         for(i=0;i<m;i++){
    48             cin >> a >> b >> c;
    49             mp[a][b] = c;
    50             mp[b][a] = c;
    51         }
    52         dijkstra();
    53         
    54         cout << dis[n] << endl;
    55     }
    56     return 0;
    57 }
    View Code
    
    
    
     
  • 相关阅读:
    关于document.referrer的使用需要注意
    Vue2.0表单校验组件vee-validate的使用
    Ubuntu 20.04 Docker 安装并配置
    换硬盘,装win10系统小记
    关于MongoDB ObjectId的那些事儿
    水平垂直居中常见解决方案
    JSON基础知识总结
    css选择器中:first-child与:first-of-type的区别
    基于jQuery选择器的整理集合
    DOM对象与jquery对象有什么不同
  • 原文地址:https://www.cnblogs.com/zmin/p/7149396.html
Copyright © 2011-2022 走看看