zoukankan      html  css  js  c++  java
  • 迪杰斯特拉板子

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <iostream>
      5 #include <vector>
      6 #include <stack>
      7 using namespace std;
      8 const int maxn=505;
      9 const int INF=0x3f3f3f3f;
     10 int n,m,s,d;
     11 int sp[maxn]; //救援人数
     12 int dj[maxn]; //距离起点最短距离
     13 int vis[maxn];//是否列入集合
     14 int road[maxn];//最短路径条数
     15 int path[maxn];//前缀节点
     16 int total[maxn];//总救援人数
     17 struct city
     18 {
     19     int e;
     20     int len;
     21 };
     22 vector <city> ve[maxn];
     23 //初始化
     24 void init ()
     25 {
     26     memset (vis,0,sizeof(vis));
     27     memset (total,0,sizeof(total));
     28     memset (road,0,sizeof(road)); 
     29     memset (path,-1,sizeof(path));
     30     for (int i=0;i<n;i++)
     31         dj[i]=INF;
     32     dj[s]=0;
     33     total[s]=sp[s];
     34     road[s]=1;
     35 }
     36 void djst ()
     37 {
     38     while (1)
     39     {
     40        int maxx=INF;
     41        int u=-1;
     42        for (int i=0;i<n;i++)
     43             if(dj[i]<maxx&&!vis[i])
     44             {
     45                maxx=dj[i];
     46                u=i;
     47             }
     48        if(u==-1)//如果u依旧还是等于-1说明全部点都已经最小了,循环结束 
     49           break;
     50        vis[u]=1;//不然以u点作为中介来向周围扩展 
     51        for (int i=0;i<ve[u].size();i++)
     52        {
     53            int v=ve[u][i].e;//以u点通过u点的边能找到v点,从而扩散v点 
     54            if(!vis[v])//如果v点还没访问过 
     55            {
     56                if(dj[v]>dj[u]+ve[u][i].len)//如果直接到v点比通过u到达v更远,则更新一下 
     57                {
     58                   dj[v]=dj[u]+ve[u][i].len;
     59                   path[v]=u;//记录一下路径,到v的前驱是u 
     60                   road[v]=road[u];//到v的最短路径与到u的最短路径条数一样 
     61                   total[v]=total[u]+sp[v];//到v的救援人数是到u的人数+v的救援人数 
     62  
     63                }
     64                else if(dj[v]==dj[u]+ve[u][i].len)//如果直接到V和通过u到v的长度一样 
     65                {
     66                    //这里要写到if语句外面
     67                     road[v]+=road[u];//那到v的最短路径数就要加上到u的最短路径条数 
     68                     if(total[u]+sp[v]>total[v])//更新救援人数和路径,因为题目中救援人数是第二关键字 
     69                     {
     70                        path[v]=u;//如果可以更新,那么v的前驱就必须是u 
     71                        total[v]=total[u]+sp[v];
     72                     }
     73                }
     74            }
     75        }
     76     }
     77 }
     78 //输出函数
     79 void output()
     80 {
     81     printf("%d %d
    ",road[d],total[d]);
     82     int temp=d;
     83     stack<int>ss;
     84     while (path[temp]!=-1)
     85     {
     86         ss.push(temp);
     87         temp=path[temp];
     88     }
     89     ss.push(s);
     90     while (!ss.empty())
     91     {
     92         printf("%d%c",ss.top(),ss.size()==1? '
    ':' ');
     93         ss.pop();
     94     }
     95 }
     96 int main()
     97 {
     98     scanf("%d%d%d%d",&n,&m,&s,&d);
     99     for (int i=0;i<n;i++)
    100         scanf("%d",&sp[i]);
    101     init();
    102     for (int i=0;i<m;i++)
    103     {
    104         int x,y,len;
    105         scanf("%d%d%d",&x,&y,&len);
    106         city temp1,temp2;
    107         temp1.e=y; temp1.len=len;
    108         temp2.e=x; temp2.len=len;
    109         ve[x].push_back(temp1);//无向图 
    110         ve[y].push_back(temp2);
    111     }
    112     djst();
    113     output();
    114     return 0;
    115 }
  • 相关阅读:
    我的2007, 兼谈些对技术的看法
    回帖整理: 关于"学习Java社区"更清晰的思路
    回帖整理: 创业心态
    我的世界观 by 爱因斯坦
    回帖整理: 论团队中的设计工作
    请大家帮我一个忙
    回帖整理: Java社区有什么可学的?
    SSL原理及应用(1)SSL协议体系结构
    文件和目录的访问控制(4) 审核规则
    强名称(2)引用强名称签名的程序集
  • 原文地址:https://www.cnblogs.com/ShadowCharle/p/11737586.html
Copyright © 2011-2022 走看看