PAT (Advanced Level) 1018. Public Bike Management (30)
先找出可能在最短路上的边,图变成了一个DAG,然后在新图上DFS求答案就可以了。
- #include<iostream>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #include<cstdio>
- #include<queue>
- #include<vector>
- using namespace std;
- const int INF=0x7FFFFFFF;
- const int maxn=;
- int n,m,C1,C2,tot;
- int Cmax;
- int val[maxn];
- struct Edge
- {
- int u,v,L;
- }e[];
- int f[];
- vector<int>g[maxn];
- int dis[][maxn];
- int ans[maxn],cnt;
- int sta[maxn];
- int MIN1,MIN2;
- void init()
- {
- MIN1=MIN2=INF;
- tot=;C1=;
- for(int i=;i<=;i++) g[i].clear();
- }
- void add(int a,int b,int c)
- {
- e[tot].u=a,e[tot].v=b,e[tot].L=c;
- g[a].push_back(tot);
- tot++;
- }
- void read()
- {
- scanf("%d%d%d%d",&Cmax,&n,&C2,&m);
- for(int i=;i<=n;i++) scanf("%d",&val[i]);
- for(int i=;i<=m;i++)
- {
- int u,v,L; scanf("%d%d%d",&u,&v,&L);
- add(u,v,L);
- add(v,u,L);
- }
- }
- void SPFA(int f,int st)
- {
- for(int i=;i<=;i++) dis[f][i]=INF;
- dis[f][st]=;
- int flag[maxn]; memset(flag,,sizeof flag);
- queue<int>Q; Q.push(st); flag[st]=;
- while(!Q.empty())
- {
- int head= Q.front(); Q.pop(); flag[head]=;
- for(int i=;i<g[head].size();i++)
- {
- int id=g[head][i];
- if(dis[f][head]+e[id].L<dis[f][e[id].v])
- {
- dis[f][e[id].v]=dis[f][head]+e[id].L;
- if(flag[e[id].v]==)
- {
- Q.push(e[id].v);
- flag[e[id].v]=;
- }
- }
- }
- }
- }
- void dfs(int x,int num1,int num2,int deep)
- {
- sta[deep]=x;
- if(x==C2)
- {
- if(num2<MIN2)
- {
- MIN2=num2;
- MIN1=num1;
- for(int i=;i<=deep;i++) ans[i]=sta[i];
- tot=deep;
- }
- else if(num2==MIN2&&num1<MIN1)
- {
- MIN2=num2;
- MIN1=num1;
- for(int i=;i<=deep;i++) ans[i]=sta[i];
- tot=deep;
- }
- return;
- }
- for(int i=;i<g[x].size();i++)
- {
- if(f[g[x][i]]==) continue;
- int to=e[g[x][i]].v;
- if(val[to]==Cmax/) dfs(to,num1,num2,deep+);
- else if(val[to]>Cmax/) dfs(to,num1+val[to]-Cmax/,num2,deep+);
- else if(val[to]<Cmax/)
- {
- if(num1>Cmax/-val[to]) dfs(to,num1+val[to]-Cmax/,num2,deep+);
- else dfs(to,,num2+Cmax/-val[to]-num1,deep+);
- }
- }
- }
- void work()
- {
- int len=dis[][C2];
- for(int i=;i<tot;i++)
- if(dis[][e[i].u]+e[i].L+dis[][e[i].v]==len)
- f[i]=;
- dfs(,,,);
- printf("%d ",MIN2);
- for(int i=;i<=tot;i++)
- {
- if(i<tot) printf("%d->",ans[i]);
- else printf("%d ",ans[i]);
- }
- printf("%d\n",MIN1);
- }
- int main()
- {
- init();
- read();
- SPFA(,C1);
- SPFA(,C2);
- work();
- return ;
- }
PAT (Advanced Level) 1018. Public Bike Management (30)的更多相关文章
- PTA (Advanced Level) 1018 Public Bike Management
Public Bike Management There is a public bike service in Hangzhou City which provides great convenie ...
- Pat(Advanced Level)Practice--1018(Public Bike Management)
Pat1018代码 题目描写叙述: There is a public bike service in Hangzhou City which provides great convenience t ...
- 【PAT甲级】1018 Public Bike Management (30 分)(SPFA,DFS)
题意: 输入四个正整数C,N,S,M(c<=100,n<=500),分别表示每个自行车站的最大容量,车站个数,此次行动的终点站以及接下来的M行输入即通路.接下来输入一行N个正整数表示每个自 ...
- PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)
1018 Public Bike Management (30 分) There is a public bike service in Hangzhou City which provides ...
- PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]
题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...
- 1018. Public Bike Management (30)
时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue There is a public bike service i ...
- 1018 Public Bike Management (30)(30 分)
时间限制400 ms 内存限制65536 kB 代码长度限制16000 B There is a public bike service in Hangzhou City which provides ...
- 1018 Public Bike Management (30 分)
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- 1018 Public Bike Management (30分) 思路分析 + 满分代码
题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...
随机推荐
- ios小功能
1.开 发过程中,我们通过http请求,后台返回json数据,而有时数据里某一字段的值为null-,然后我们把此值赋值给 NSArray,NSdictionary,或是NSString,然后我们会判断 ...
- JavaScript焦点事件、鼠标事件和滚轮事件使用详解
网址:http://www.jb51.net/article/78094.htm
- 中文输入法不触发onkeyup事件的解决办法
当监听一个input的keyup的事件的时候,英文输入法的情况下可以实时的通过keyup事件检测到文本框value的变化,但是当输入法变成中文后,input的keyup事件就不会被正常触发. 方法:o ...
- [转载] 关于Windows Boot Manager、Bootmgfw.efi、Bootx64.efi、bcdboot.exe 的详解
原帖: http://bbs.wuyou.net/forum.php?mod=viewthread&tid=303679 前言:1.本教程针对于UEFI启动来叙述的,根据普遍的支持UEFI的机 ...
- Stu Website
GIT: 分支的新建与合并 https://git-scm.com/book/zh/v2/Git-分支-分支的新建与合并 分支的管理 https://git-scm.com/book/zh/v1/Gi ...
- C#判断文字是否为汉字
/// <summary> /// 检测一个字符串是不是以汉字开始 /// </summary> /// <param name="str">要 ...
- STM32F4系统时钟配置及描述
STM32F4系统时钟配置及描述 stm32f407时钟配置方法(感觉很好,分享一下) STM32F4_RCC系统时钟配置及描述 STM32F4时钟设置分析 stm32f4 - 时钟树分析配置
- 非常简单的oracle和mysql数据互传
工具是navicat,我用的是Navicat Premium 10: 这个工具可以同时连接mysql和oracle,如图: 同时连接上这两个库之后 工具->数据传输 左边是数据源,右边是导入目标 ...
- Debian 安装 vmware-tools 手记
debian 8.5 源 deb http://ftp.de.debian.org/debian jessie main http://mirrors.163.com/.help/debian.htm ...
- C语言版的16进制与字符串互转函数
http://www.cnblogs.com/nio-nio/p/3309367.html /* // C prototype : void StrToHex(BYTE *pbDest, BYTE * ...