关闭

*浙大PAT甲级 1087 dijkstra+dfs

105人阅读 评论(0) 收藏 举报
分类:

由于输入的是城市名称,因此要先将名称与id想对应,可以用map映射。

dist数组代表源点到该点的最短路径,path数组记录推荐路径,num数组记录源点到该点的最大happy值。

通过dijkstra来得出最短路径以及最大happy值和相应路径。

但关键是怎么求有多少条总和为最短路径的路径数,这里可以通过得到的最短路径进行深度优先搜索。

AC代码:

#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define ll long long
#define inf 999999999
using namespace std;
map<string,int> mm;
vector<string> vv;
int hap[220];
int a[200][200];
int mark[200];
int dist[200];
int path[200];
int num[200];
int ans=0;
int biaoji;
int n,k;
void dfs(int x,int now,int dis)
{
    if(x==biaoji&&now==dis)
    {
        ans++;
        return;
    }
    for(int i=0;i<n;i++)
    {
        if(mark[i]==0&&i!=x&&a[x][i]!=inf)
        {
            mark[i]=1;
            dfs(i,now+a[x][i],dis);
            mark[i]=0;
        }
    }
}
int main()
{
    string s;
    scanf("%d %d",&n,&k);
    cin>>s;
    mm[s]=0;
    vv.push_back(s);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            a[i][j]=i==j?0:inf;
        }
    }
    for(int i=0;i<n-1;i++)
    {
        string tmp;
        int d;
        cin>>tmp;
        scanf("%d",&d);
        mm[tmp]=i+1;
        hap[i+1]=d;
        vv.push_back(tmp);
        if(tmp=="ROM")
        {
            biaoji=i+1;
        }
    }
    for(int i=0;i<k;i++)
    {
      string l,r;
      cin>>l>>r;
      int d;
      scanf("%d",&d);
      a[mm[l]][mm[r]]=a[mm[r]][mm[l]]=d;
    }
    for(int i=0;i<n;i++)
    {
        dist[i]=a[0][i];
        if(dist[i]!=inf)
        {
            num[i]=hap[i];
            path[i]=0;
        }
        else
        {
            path[i]=-1;
        }
    }
    path[0]=-1;
    mark[0]=1;
    for(int i=0;i<n-1;i++)
    {
        int minn=inf;
        int biao;
        for(int j=0;j<n;j++)
        {
            if(mark[j]==0&&dist[j]<minn)
            {
                minn=dist[j];
                biao=j;
            }
        }
        mark[biao]=1;
        for(int j=0;j<n;j++)
        {
            if(mark[j]==0)
            {
                if(dist[biao]+a[biao][j]<dist[j])
                {
                    dist[j]=dist[biao]+a[biao][j];
                    num[j]=num[biao]+hap[j];
                    path[j]=biao;
                }
                else if(dist[biao]+a[biao][j]==dist[j])
                {
                    if(num[biao]+hap[j]>num[j])
                    {
                        num[j]=num[biao]+hap[j];
                        path[j]=biao;
                    }
                }
            }
        }
    }
    int d=biaoji;
    //cout<<d<<endl;
    memset(mark,0,sizeof(mark));
    dfs(0,0,dist[biaoji]);
    vector<int> v;
    int dd=1;
    v.push_back(d);
    while(path[d]!=-1)
    {
        v.push_back(path[d]);
        dd++;
        d=path[d];
    }
    printf("%d %d %d %d\n",ans,dist[biaoji],num[biaoji],num[biaoji]/(dd-1));
    cout<<vv[v[dd-1]];
    for(int i=dd-2;i>=0;i--)
    {
        cout<<"->"<<vv[v[i]];
    }
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

PAT甲级题解目录

github源码地址:https://www.github.com/liuchuo/PAT ID Title C/C++(附分析) 备注 1001 A+B Format (20) 查看题解 字符串处理 1002 A+B for Po...
  • liuchuo
  • liuchuo
  • 2016-09-10 22:19
  • 5486

浙大PAT考试1009~1012(1010是个神题。。)

哎,pat1010居然用java写的,不仅用java写的,还加了二分,,,唉,智商捉急啊,主要是pat有的范围也不给清楚。给人造成遐想的空间。。 还是按顺序介绍。。 题目地址:http://pat.zju.edu.cn/contests/pat-a-practise 1009: 题目...
  • opm777
  • opm777
  • 2014-06-13 01:22
  • 1719

浙大PAT考试1013~1016(最伤的一次。。)

我能说我1016WA了几天都不得最后还是拿别人代码交的么。。。 真心找不到那个神数据。。。 自己把整个程序的流程都画出来了,仔细推敲是木有问题的啊。。。 题目地址:http://pat.zju.edu.cn/contests/pat-a-practise 先从1013开始介绍。 题目大意...
  • opm777
  • opm777
  • 2014-06-29 23:40
  • 2065

PAT程序设计练习——甲级1002(两个多项式的解析与合并)

PAT程序设计能力测试 题目原文链接:点击打开链接 翻译题目要求: 程序输入为两行:均为一个多项式,按 K N1 An1 N2 An2 ......Nk Ank,K代表的是多项式的非零项数,范围闭区间是[1,10],N1到Nk的范围区间是 1 Nk是指数,Ank是系数,遇到相同的指数,系数进行累加...
  • xexiyong
  • xexiyong
  • 2015-12-14 13:18
  • 1091

PAT 1003. Emergency (25) (求两点间最短路的条数)

1003. Emergency (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emergency rescue team leader ...
  • IAccepted
  • IAccepted
  • 2014-03-18 12:19
  • 7803

浙大pat甲级 1025

结构体排序问题,可用vector v[105] 分别来保存每个考场考生的信息,分别对每个考场的学生按照成绩来排序得出每个考场的排名,再将学生全部存到总的vector中并排序,得出这次考试全部学生的排名,注意分数相同排名一样。 ac代码: #include #include #include #i...
  • luowei5513
  • luowei5513
  • 2016-08-14 15:04
  • 128

浙大 PAT 甲级1009

1009. Product of Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN...
  • qq_32146369
  • qq_32146369
  • 2016-10-14 20:53
  • 448

<心情随笔>2017.3.4 第一次PAT甲级惨烈结果_小结

说不伤心是假的,真的挺伤心的。 毕竟准备了一整个寒假,算法笔记也都逼着自己看了一遍。 不知道那些大佬们是什么感觉,反正除了那道微博转发抽奖的20分的题目我看懂了之外,后面三道可以说当时脑子就是一片空白。。。第二道连蒙带猜居然过了一个测试点。。。 所以说,不能因为自己考的特别渣就说报这场考试不值,没有...
  • UNuomo
  • UNuomo
  • 2017-03-04 21:34
  • 641

浙大PAT甲级 1026

这个题目模拟队列,需要考虑的条件很多,在此列出: (1)vip的顾客优先考虑vip桌子,如果没有空vip桌子则考虑普通桌。 (2)普通客户也可以占vip桌子,当有多个桌子空则选择编号最小的桌。 (3)客户占用桌子时间不能超过2小时,超过则按2小时计算。 (4)如果在21点之前没有能够占到桌子...
  • luowei5513
  • luowei5513
  • 2016-08-20 11:47
  • 606

浙大PAT甲级-1002

这道题是大一的时候就做过的,当时刚学运算符重载。现在我用的是链表来做的,也算是复习一下快忘光的数据结构吧。#include #include using namespace std; //节点(多项式的项) struct listNode{ int exp; double coe; lis...
  • Nostalgia_
  • Nostalgia_
  • 2017-05-29 21:11
  • 169
    个人资料
    • 访问:13442次
    • 积分:997
    • 等级:
    • 排名:千里之外
    • 原创:91篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档