zoukankan      html  css  js  c++  java
  • 团体程序设计天梯赛-练习集

     1 L2-001 紧急救援(25 分)
     2 
     3 #include <iostream>
     4 #include <cstdio>
     5 #include <algorithm>
     6 #include <cstring>
     7 #include <vector>
     8 #include <utility>
     9 #include <queue>
    10 using namespace std;
    11 typedef pair<int,int>P;
    12 int n,m,s,d;
    13 const int  N=550;
    14 const int inf=0x3f3f3f3f;
    15 int val[N],dis[N],pre[N],prenum[N];
    16 int tval[N];
    17 struct Node{
    18     int  to,w;
    19     Node(){}
    20     Node(int TO,int W){
    21         to=TO;
    22         w=W;
    23     }
    24 };
    25 vector<Node>vec[N];
    26 void bfs(int  sta){
    27     priority_queue<P,vector<P>,greater<P> >que;
    28     que.push(P(0,sta));//此时的优先队列会按照first的值排序
    29     prenum[sta]=1;//1,不是0
    30     tval[sta]=val[sta];
    31     dis[sta]=0;
    32     while(!que.empty()){
    33         P q=que.top();
    34         que.pop();//容易忘记,弹出队列
    35         int v=q.second;
    36         if(dis[v]<q.first) continue;
    37         for(int i=0;i<vec[v].size();i++){
    38             Node Nod=vec[v][i];
    39             int t=Nod.to;
    40             if(dis[t]>dis[v]+Nod.w){
    41                 dis[t]=dis[v]+Nod.w;
    42                 pre[t]=v;//记录最短路上的该点的前一个点
    43                 tval[t]=tval[v]+val[t];//救援队数目是依次累加的
    44                 prenum[t]=prenum[v];
    45                 que.push(P(dis[t],t));//容易忘记,压入队列
    46             }
    47             else if(dis[t]==dis[v]+Nod.w){
    48                 prenum[t]+=prenum[v];//到t的路径数目要加上到v的路径数目
    49                 if(tval[t]<tval[v]+val[t]){//只有救援队数目多了,才会更新节点
    50                     tval[t]=tval[v]+val[t];
    51                     pre[t]=v;    
    52                 }
    53             }
    54         }
    55     }    
    56 }
    57 int  main()
    58 {
    59     scanf("%d%d%d%d",&n,&m,&s,&d);
    60     for(int i=0;i<n;i++)
    61         scanf("%d",&val[i]);
    62     int  x,y,z;
    63     for(int  i=0;i<m;i++){
    64         scanf("%d%d%d",&x,&y,&z);
    65         vec[x].push_back(Node(y,z));
    66         vec[y].push_back(Node(x,z));//本题为无向图
    67     }
    68     memset(pre,-1,sizeof(pre));//不能初始化为0,0也是节点
    69     memset(dis,inf,sizeof(dis));
    70     bfs(s);
    71     printf("%d %d
    ",prenum[d],tval[d]);
    72     int ans=0;
    73     int ret[N];
    74     int cur=d;
    75     while(cur!=-1){
    76         ret[ans++]=cur;
    77         cur=pre[cur];
    78     }
    79     for(int i=ans-1;i>=0;i--){
    80         printf("%d%c",ret[i],i==0?'
    ':' ');
    81     }
    82     return   0;
    83 }
  • 相关阅读:
    sns矩阵
    家庭博客
    媒体治国
    论坛有
    模型指向同一地址,结构体指向不同地址
    苹果开发者公司账号添加个人开发者 加入不了开发者团队
    SourceTree下载 及使用
    关于swift语言中导入OC三方类找不到头文件的解决方法
    iPhone iPad 各种控件默认高度
    iOS 基于MVC设计模式的基类设计
  • 原文地址:https://www.cnblogs.com/tingtin/p/9313486.html
Copyright © 2011-2022 走看看