POJ 2679:Adventurous Driving(SPFA+DFS)
http://poj.org/problem?id=2679
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 1596 | Accepted: 455 |
Description
John Doe plans to take advantage of CSAD for saving money he needs to repair his old car. When driving from A to B, John follows a path he calls optimal: a path that is rewarding and has the minimal length out of the paths with the minimal weight from A to B. In John's opinion, a path is rewarding if all the roads in the path are rewarding, and a road (X,Y) is rewarding if it has the minimal entry fee out of the roads leaving X. The weight of a path is the sum of the entry fees paid along the path. The length of a path cumulates the length of the roads in the path. The problem is helping John to compute the weight and the length of an optimal path from A to B on a given map.
For example, on the illustrated road map vertices designate cities and edges stand for roads. The label fuv[L]fvu of the road (u,v) shows the fee fuv for driving from u to v, the fee fvu for driving from v to u, and the length L of the road. The path (0,2,4,3,5) from 0 to 5 is optimal: it is rewarding, has weight 2 (-1+3+0+0) and length 50 (5+10+5+30). The path (0,1,4,3,5), although rewarding and of weight 2, has length 51. The path (0,3,5) has weight 0 and length 20 but it is not rewarding.
Input
Output
Sample Input
3 3 0 2 (0,1,0[1]0) (0,2,1[1]0) (1,2,1[1]0)
3 3 0 2 (0,1,-1[1]1) (0,2,0[1]0) (1,2,0[1]1)
7 11 0 5 (0,1,-1[6]4) (0,2,-1[5]4) (0,3,0[1]0) (1,4,3[10]1)
(2,4,3[10]1) (3,4,0[5]0) (3,5,0[30]0) (3,5,1[20]0)
(4,6,0[3]1) (6,5,1[8]0) (6,6,0[2]-1)
Sample Output
VOID
UNBOUND
2 50
Hint
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define INF 0x3f3f3f3f
using namespace std;
#define N 1110
struct edge
{
int l, w, v;
edge () {}
edge (int v, int w, int l) : v(v), w(w), l(l) {}
};
int st, ed, lfee[N], vis[N], dis[N], fee[N], cnt[N], n, m;
vector <vector<edge> > G, R;
//就是vector<edge> G[N]; void add(vector<vector<edge> > &G, int u, int v, int w, int l)
{
G[u].push_back(edge(v, w, l));
} //删除不是最小费用的边
void edge_clear()
{
for(int i = ; i < n; i++) {
for(vector<edge>::iterator p = G[i].begin(); p != G[i].end(); ) {
if(p->w > lfee[i]) {
p = G[i].erase(p);
} else {
p++;
}
}
}
} //删除从起点到终点不会走过的点
void node_clear()
{
for(int i = ; i < n; i++) {
if(!vis[i]) {
G[i].clear();
continue;
}
for(vector<edge>::iterator p = G[i].begin(); p != G[i].end(); ) {
if(!vis[p->v]) {
p = G[i].erase(p);
} else {
p++;
}
}
}
} //将图翻转
void reg()
{
R = vector<vector<edge> > (n);
for(int i = ; i < n; i++) {
for(vector<edge>::iterator p = G[i].begin(); p != G[i].end(); p++) {
add(R, p->v, i, p->w, p->l);
}
}
} //标记从终点走出去可以经过哪些点
void dfs(int u)
{
vis[u] = ;
for(int i = ; i < R[u].size(); i++) {
int v = R[u][i].v;
if(!vis[v]) dfs(v);
}
} bool spfa()
{
for(int i = ; i <= n; i++) {
dis[i] = INF; fee[i] = INF;
}
memset(vis, , sizeof(vis));
memset(cnt, , sizeof(cnt));
dis[st] = ;
fee[st] = ;
vis[st] = ;
queue <int> que;
while(!que.empty()) que.pop();
que.push(st);
while(!que.empty()) {
int u = que.front(); que.pop();
cnt[u]++;
if(cnt[u] > n) return false;
vis[u] = ;
for(int i = ; i < G[u].size(); i++) {
int v = G[u][i].v, w = G[u][i].w, l = G[u][i].l;
if(fee[v] >= fee[u] + w) {
if(fee[v] > fee[u] + w) {
fee[v] = fee[u] + w;
dis[v] = dis[u] + l;
if(!vis[v]) {
vis[v] = ;
que.push(v);
}
} else if(dis[v] > dis[u] + l) {
dis[v] = dis[u] + l;
if(!vis[v]) {
vis[v] = ;
que.push(v);
}
}
}
}
}
} int main()
{
while(~scanf("%d%d%d%d", &n, &m, &st, &ed)) {
memset(lfee, INF, sizeof(lfee));
G.clear(); R.clear();
G = vector<vector<edge> > (n);
for(int i = ; i < m; i++) {
int u, v, uv, vu, l;
scanf(" (%d,%d,%d[%d]%d)", &u, &v, &uv, &l, &vu);
add(G, u, v, uv, l);
add(G, v, u, vu, l);
if(lfee[u] > uv) lfee[u] = uv;
if(lfee[v] > vu) lfee[v] = vu;
//记录出边的最小的费用
} memset(vis, , sizeof(vis));
edge_clear();
reg();
dfs(ed);
if(!vis[st]) {
printf("VOID\n");
continue;
}
node_clear();
bool flag = spfa();
if(!flag) printf("UNBOUND\n");
else printf("%d %d\n", fee[ed], dis[ed]);
}
return ;
}
POJ 2679:Adventurous Driving(SPFA+DFS)的更多相关文章
- 【PAT甲级】1030 Travel Plan (30 分)(SPFA,DFS)
题意: 输入N,M,S,D(N,M<=500,0<S,D<N),接下来M行输入一条边的起点,终点,通过时间和通过花费.求花费最小的最短路,输入这条路径包含起点终点,通过时间和通过花费 ...
- 【PAT甲级】1018 Public Bike Management (30 分)(SPFA,DFS)
题意: 输入四个正整数C,N,S,M(c<=100,n<=500),分别表示每个自行车站的最大容量,车站个数,此次行动的终点站以及接下来的M行输入即通路.接下来输入一行N个正整数表示每个自 ...
- 题目1008:最短路径问题(SPFA算法)
问题来源 http://ac.jobdu.com/problem.php?pid=1008 问题描述 给定一个G(V,E)有向图,起点s以及终点t,求最短路径. 问题分析 典型的单源最短路径问题,可以 ...
- POJ 2796:Feel Good(单调栈)
http://poj.org/problem?id=2796 题意:给出n个数,问一个区间里面最小的元素*这个区间元素的和的最大值是多少. 思路:只想到了O(n^2)的做法. 参考了http://ww ...
- POJ 3318:Matrix Multiplication(随机算法)
http://poj.org/problem?id=3318 题意:问A和B两个矩阵相乘能否等于C. 思路:题目明确说出(n^3)的算法不能过,但是通过各种常数优化还是能过的. 这里的随机算法指的是随 ...
- 【PAT甲级】1003 Emergency (25 分)(SPFA,DFS)
题意:n个点,m条双向边,每条边给出通过用时,每个点给出点上的人数,给出起点终点,求不同的最短路的数量以及最短路上最多能通过多少人.(N<=500) AAAAAccepted code: #in ...
- POJ 1200:Crazy Search(哈希)
Crazy Search Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32483 Accepted: 8947 Des ...
- 【题解】洛谷P2296 [NOIP2014TG] 寻找道路(SPFA+DFS)
题目来源:洛谷P2296 思路 一开始看还以为是一道水题 虽然本来就挺水的 本道题的难点在于如何判断是否路径上的点都会直接或者间接连着终点 我们需要在一开始多建一个反向图 然后从终点DFS回去 把路径 ...
- PAT (Advanced Level) Practise 1003 Emergency(SPFA+DFS)
1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...
随机推荐
- PostgreSQL9.3:JSON 功能增强 根据PQ中文论坛francs 给出的东西结合自己的摸索总结下
在 PostgreSQL 9.2 版本中已经支持 JSON 类型,不过支持的操作非常有限,仅支持以下函数 array_to_json(anyarray [, pretty_bool]) row_ ...
- System.Windows.Documents.Run
希望采用不同的方案来书写文字,可以使用多个TextBlock,也可以使用一个TextBlock+多个Run <TextBlock FontSize="12" Margin=& ...
- VC++互相转码GBK,unicode,utf8
windows平台下微软的库自带了一些api可用于几种编码格式间的互相转码,其实可以用一个iconv开源跨平台的转码库,那个方法更方便且统一. 使用前要引入头文件和命名空间 #include < ...
- WPF 用代码调用dynamic resource动态更改背景 - CSDN博客
原文:WPF 用代码调用dynamic resource动态更改背景 - CSDN博客 一般dynamic resoource通常在XAML里调用,如下范例: <Button Click=&qu ...
- win10 uwp 异步转同步
原文:win10 uwp 异步转同步 有很多方法都是异步,那么如何从异步转到同步? 可以使用的方法需要获得是否有返回值,返回值是否需要. 如果需要返回值,使用GetResults 如从文件夹获取文件: ...
- git服务器创建,冲突解决,远程仓库获取指定文件
1.git服务器创建 在公司多人协作开发的情况下,不能简单地使用github,因为github是互联网公开的,这种情况公司的代码的保密性就会丧失了.这种情况下,需要创建git服务器. 登录服务器,使用 ...
- win10 应用商店/相机/计算器误删后的修复方法
“以管理员身份运行”Windows Powershell. 然后在打开的“管理员:Windows Powershell”窗口中输入以下重装应用商店的命令: //商店恢复 Get-AppXPackage ...
- Android零基础入门第72节:SwipeRefreshLayout下拉刷新
在实际开发中,经常都会遇到下拉刷新.上拉加载更多的情形,这一期就一起来学习Android系统的SwipeRefreshLayout下拉刷新组件. 一.SwipeRefreshLayout简介 Swip ...
- Tobject 类解析
TObject = class //创建 constructor Create; //释放 procedure Free; //初始化实列 class functi ...
- MiTeC System Information Component Suite 10.9.2 D5-XE3 Full Source
The most complex system information probe in Delphi world, it consists of many standalone components ...