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 ...
随机推荐
- WPF 通过CommandBinding捕获命令
RoutedCommand与业务逻辑无关,业务逻辑是通过CommandBinding来实现 using System; using System.Collections.Generic;using S ...
- jquery 相对元素
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- ASP.NET MVC4使用JCrop裁剪图片并上传
需要用到的jquery插件Jcrop .Jquery.form 百度webuploader插件( http://fex.baidu.com/webuploader/ ) 引用下载好的css和js文件 ...
- 调用API函数减少c#内存占用(20+m减至1m以下)
原文:调用API函数减少c#内存占用(20+m减至1m以下) c#虽然内置垃圾回收机制,但是并不能解决程序占用内存庞大的问题,如果我们仔细观察任务管理器,我们会发现一个程序如果最小化的时候,它所占用的 ...
- WPF判断两个PNG图片是否碰撞
这个方法有几个前提 1.两个Image必须在一个Canvas中 2.两个Image的Canvas.Top和Canvas.Left必须赋值 上一篇讲了判断一个PNG图片某个点是否透明 这个基本类似的方法 ...
- shell脚本配置ssh免密登陆
通过shell脚本配置免密登陆,分为两个脚本,一个是配置文件config.env,一个是正式脚本sshkey.sh. # config.envexport HOST_USER=(root) expor ...
- Windows 8各种流之间的转换
//String 转 Buffer private IBuffer GetBufferFromString(String str) { using (InMemoryRandomAccessStrea ...
- CS224n笔记二:word2vec
如何表示词语的意思 语言学中meaning近似于"指代,代指,符号". 计算机中如何处理词语的意思 过去一直采用分类词典,计算语言学中常见的方式时WordNet那样的词库,比如NL ...
- MySql 小内存优化
MySql5.6启动内存近500M,如在小型机内存敏感的环境可能较大,下边配置会减少较多内存,至150M以下. performance_schema = OFF innodb_buffer_pool_ ...
- 用python的curl和lxml来抓取和分析网页内容
Curl是一个强大的URL语法的客户端,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, PO ...