zoukankan      html  css  js  c++  java
  • PAT甲级 All Roads Lead to Rome (dijkstra+dfs回溯)

    All Roads Lead to Rome 

    本题需要记录一共有几条最短路径,并输出最短路中开心值最大的路径或者开心值相等的情况下输出平均开心值最大的路径。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <queue>
      5 #include <vector>
      6 #include <map>
      7 #include <algorithm>
      8 #define inf 0x3f3f3f3f
      9 using namespace std;
     10 const int maxn=220;
     11 int n,m;
     12 string s1,s2,st;
     13 int cnt;
     14 int fhappy=0;
     15 double fhave=0;
     16 
     17 map<string,int>mp1;
     18 map<int,string>mp2;
     19 struct node{
     20     int pos;
     21     int cost;
     22     node(){}
     23     node(int pos,int cost):pos(pos),cost(cost){}
     24     friend bool operator < (node a,node b)
     25     {
     26         return a.cost>b.cost;
     27     } 
     28 }head,tail;
     29 vector<node>g[maxn];
     30 vector<int> pre[maxn];
     31 vector<int> path;
     32 vector<int> tpath;
     33 int vis[maxn],dis[maxn];
     34 int happy[maxn];
     35 void dijkstra(int st)
     36 {
     37     priority_queue<node> q;
     38     dis[st]=0;
     39     head.pos=st;
     40     head.cost=0;
     41     q.push(head);
     42     while(!q.empty())
     43     {
     44         head=q.top();
     45         q.pop();
     46         if(vis[head.pos]) continue;
     47         vis[head.pos]=1;
     48         int now=head.pos;
     49         for(int i=0;i<g[now].size();i++)
     50         {
     51             tail=g[now][i];
     52             int v=tail.pos;
     53             int len=tail.cost;
     54             if(dis[v]>dis[head.pos]+len)
     55             {
     56                 dis[v]=dis[head.pos]+len;
     57                 pre[v].clear();
     58                 pre[v].push_back(head.pos);
     59                 q.push(tail);
     60             }
     61             else if(dis[v]==dis[head.pos]+len)
     62             {
     63                 pre[v].push_back(head.pos);
     64                 q.push(tail);
     65             }            
     66         }
     67     }
     68 }
     69 void dfs(int now)
     70 {
     71     if(now==0)
     72     {
     73         cnt++;
     74         tpath.push_back(now);
     75         int hval=0;
     76         for(int i=tpath.size()-2;i>=0;i--)
     77         {
     78         //    cout<<"lala"<<tpath[i]<<endl;
     79             hval+=happy[tpath[i]];
     80         }
     81         double have=1.0*hval/(tpath.size()-1);
     82         if(hval>fhappy)
     83         {
     84             fhappy=hval;
     85             fhave=have;
     86             path=tpath;
     87         }
     88         else if(hval==fhappy&&have>fhave)
     89         {
     90             fhappy=hval;
     91             fhave=have;
     92             path=tpath;
     93         }
     94         tpath.pop_back();
     95         return;
     96     }
     97     tpath.push_back(now);
     98     for(int i=0;i<pre[now].size();i++)
     99     {
    100         dfs(pre[now][i]);
    101     }
    102     tpath.pop_back();
    103 }
    104 int main()
    105 {
    106     cin>>n>>m>>st;
    107     memset(dis,inf,sizeof(dis)); 
    108     mp1[st]=0;
    109     mp2[0]=st;
    110     int t;
    111     for(int i=1;i<=n-1;i++)
    112     {
    113         cin>>s1>>happy[i];
    114         mp1[s1]=i;
    115         mp2[i]=s1;
    116     } 
    117     for(int i=0;i<m;i++)
    118     {
    119         cin>>s1>>s2>>t;
    120         int id1=mp1[s1];
    121         int id2=mp1[s2];
    122         node tmp;
    123         tmp.pos=id2;
    124         tmp.cost=t;
    125         g[id1].push_back(tmp);
    126         tmp.pos=id1;
    127         g[id2].push_back(tmp);
    128     }
    129     int ed=mp1["ROM"];
    130     dijkstra(0);
    131     dfs(ed);
    132     printf("%d %d %d %d
    ",cnt,dis[ed],fhappy,(int)fhave);
    133     for(int i=path.size()-1;i>=0;i--)
    134     {
    135         cout<<mp2[path[i]];
    136         if(i!=0)
    137         {
    138             printf("->");
    139         } 
    140     }
    141     return 0;
    142 }
  • 相关阅读:
    浅谈c/c++中的指针问题
    谈谈八大排序算法问题
    隐藏在default construct后面的是什么
    浅谈编译过程和符号表重定位问题
    1.在VC编译器下面为什么每个头文件以及源文件都要包含“stdAfx.h”,那么stdAfx.h中到底存放了什么,用来做什么?
    成长从今天开始
    正则表达式
    安装RPM包或者安装源码包
    文档的压缩与打包
    文本编辑工具
  • 原文地址:https://www.cnblogs.com/1013star/p/10357601.html
Copyright © 2011-2022 走看看