zoukankan      html  css  js  c++  java
  • 紧急救援 L2-001 dijkstra 打印路径 最短路条数 权值

    较为复杂的dijkstra 

    包含路径打印  最小路的条数  最小路径的情况下取最大权值

    v0要是标记就会出错。。。?

    有权值的题目  不能设置mp[i][i]为0  否则会无限加权

    这题很有参考价值 可以当模板

    #include<iostream>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    using namespace std;
    
    #define N 505
    #define inf 0x3f3f3f3f
    
    int path[N];//输出路径   存放的是i的前一个点  path[j]=u;
    int n,e,m,s;
    int vis[N],dis[N],mp[N][N];
    int city[N];//为权值   第一优先级为最短路  第二优先级为权值最或者最小 此为第二类权值(和点相连) 还有一种权值为和路相连 那种更简单
    int peo[N];
    int pathnum[N];//最短路的条数!!!   初始为1   只要在路径相同时累合即可
    
    void dijkstra(int s)
    {
        memset(vis,0,sizeof vis);
    
        for(int i=0;i<n;i++)
            dis[i]=mp[s][i];
        dis[s]=0;
    
        path[s]=-1;
        peo[s]=city[s];
        pathnum[s]=1;
        
        //明确规定不加vis[s]
    
        for(int i=1;i<=n;i++)
        {
            int minn=inf,u=-1;
            for(int j=0;j<n;j++)
                if(!vis[j]&&minn>dis[j])
                   minn=dis[u=j];
    
            if(u==-1)return;
            vis[u]=1;
    
            for(int j=0;j<n;j++)
            {
    
                if(dis[j]>dis[u]+mp[u][j])
                {
                   // pathnum[j]=pathnum[u];//最短路条数
                    dis[j]=dis[u]+mp[u][j];
                    path[j]=u;
                    peo[j]=peo[u]+city[j];
                }
                else if(dis[j]==dis[u]+mp[u][j])
                {
                   // pathnum[j]+=pathnum[u];//最短路条数
                    if(peo[j]<peo[u]+city[j])
                    {
                    path[j]=u;
                    peo[j]=peo[u]+city[j];
                    }
                }
            }
        }
    }
    
    void print(int x)
    {
       if(path[x]==-1)
        {printf("%d",x);return;}
       print(path[x]);
        printf(" %d",x);
        return ;
    }
    
    int main()
    {
        scanf("%d%d%d%d",&n,&m,&s,&e);
        for(int i=0;i<n;i++)scanf("%d",&city[i]);
        
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
          mp[i][j]=inf;//如果加上 i==j 时mp为0  则可以反复刷权值
          
         while(m--)
         {
             int a,b,c;
             scanf("%d%d%d",&a,&b,&c);
             if(mp[a][b]>c)mp[a][b]=mp[b][a]=c;
         }
         dijkstra(s);
         printf("%d %d
    ", pathnum[e] ,peo[e] );
         print(e);
        return 0;
    }
  • 相关阅读:
    jenkins:通过execute shell启动的进程会被杀死的问题
    Cacti:添加监控磁盘IO
    Linux:添加永久路由
    Linux:下载方式安装lrzsz
    Linux:Vmware安装linux虚拟机,桥接方式配置静态IP后重启网卡,提示:Error,some other host already uses address 10.252.252.21...
    Linux:安装rstatd,报错
    Linux:安装图形界面
    leetcode Median of Two Sorted Arrays
    算法导论 寻找第i小元素 9.2
    算法导论9.1-1
  • 原文地址:https://www.cnblogs.com/bxd123/p/10369166.html
Copyright © 2011-2022 走看看