POJ 3411 Paid Roads (状态压缩+BFS)
题意:有n座城市和m(1<=n,m<=10)条路。现在要从城市1到城市n。有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱,
如果没有去过就付R的钱。求的是最少要花多少钱。
析:BFS,然后由于走的路线不同,甚至边或者点都可能多走,所以用状态压缩。然后本题有坑啊,有重连,而且有很多条重边,所以多走几次就好了。
代码如下:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <sstream>
#define debug() puts("++++");
#define gcd(a, b) __gcd(a, b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std; typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e16;
const double inf = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 10 + 5;
const int mod = 100000000;
const int dr[] = {-1, 0, 1, 0};
const int dc[] = {0, 1, 0, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline bool is_in(int r, int c){
return r >= 0 && r < n && c >= 0 && c < m;
} struct Node{
int to, c, p, r, next;
Node(){ }
Node(int t, int cc, int pp, int rr, int n)
: to(t), c(cc), p(pp), r(rr), next(n) { }
};
Node a[maxn*2];
int head[maxn], cnt; void add_edge(int u, int v, int c, int p, int r){
a[cnt] = Node(v, c, p, r, head[u]);
head[u] = cnt++;
} struct State{
int state, pos;
State(int s, int p) : state(s), pos(p) { }
};
int dp[1<<10][10];
int vis[10]; int bfs(){
queue<State> q;
int ans = INF;
q.push(State(0, 0));
memset(dp, INF, sizeof dp);
memset(vis, 0, sizeof vis);
dp[0][0] = 0; while(!q.empty()){
State u = q.front(); q.pop();
int state = u.state;
if(u.pos + 1 == n){
ans = min(ans, dp[state][u.pos]);
continue;
}
for(int i = head[u.pos]; ~i; i = a[i].next){
int v = a[i].to;
int c = a[i].c;
int r = a[i].r;
int p = a[i].p;
if(vis[v] > 50) continue;
++vis[v];
dp[state|(1<<v)][v] = min(dp[state|(1<<v)][v], dp[state][u.pos] + ((state&(1<<c)) ? p : r));
q.push(State(state|(1<<v), v));
}
}
return ans;
} int main(){
while(scanf("%d %d", &n, &m) == 2){
cnt = 0;
memset(head, -1, sizeof head);
for(int i = 0; i < m; ++i){
int u, v, c, p, r;
scanf("%d %d %d %d %d", &u, &v, &c, &p, &r);
add_edge(u-1, v-1, c-1, p, r);
}
int ans = bfs();
if(ans == INF) printf("impossible\n");
else printf("%d\n", ans);
}
return 0;
}
POJ 3411 Paid Roads (状态压缩+BFS)的更多相关文章
- 多次访问节点的DFS POJ 3411 Paid Roads
POJ 3411 Paid Roads Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6553 Accepted: 24 ...
- POJ - 1324 Holedox Moving (状态压缩+BFS/A*)
题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...
- POJ 3411 Paid Roads(SPFA || DFS)
题目链接 题意 : 要从1城市到n城市,求最短路是多少,从a城市到达b城市的路程,如果你到过c城市,则需要走p,否则走r长. 思路 : 因为可以来回走,所以不能用单纯的最短路,可以用二维SPFA,状态 ...
- POJ 1753 Flip Game(状态压缩+BFS)
题目网址:http://poj.org/problem?id=1753 题目: Flip Game Description Flip game is played on a rectangular 4 ...
- poj 3411 Paid Roads(dfs)
Description A network of m roads connects N cities (numbered to N). There may be more than one road ...
- poj 3411 Paid Roads很水的DFS
题意:给你N 城市和M条道路,每条道路要付的钱,但是如果你在这个道路上你可以付其他道路的钱(跟走到的时候去的话不一样),问你从1走到N最少话费是多少. 直接DFS搜. 链接http://poj.org ...
- POJ 3411 Paid Roads(DFS)
题目链接 点和边 都很少,确定一个界限,爆搜即可.判断点到达注意一下,如果之前已经到了,就不用回溯了,如果之前没到过,要回溯. #include <cstring> #include &l ...
- poj 3411 Paid Roads
题意:有m条路,n座城市,走这些路是要付费的,每条路由两种付费方案,设一条路两端是a,b,如果走完这条路在b点付费的话,应付r,如果走这条路之前在c点付费的话,应付p,求从1端点走到n端点的最小费用. ...
- 胜利大逃亡(续)(状态压缩bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
随机推荐
- poj1325
给出一系列任务,每个任务可以在机器A的某个模式,或者在机器B的某个模式下完成.机器A和B每切换一次模式需要重启一次.问完成这些任务,最少需要重启机器多少次? 把任务看作边 “重启”操作看作点 这道题就 ...
- Git 常用命令详解(三)
转自:http://www.cnblogs.com/1-2-3/archive/2010/07/18/git-commands.html
- JSplitPane的简单实现
import java.awt.Color; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.J ...
- python+rabbitmq实现分布式
#master # -*- coding: utf-8 -*-import sys#reload(sys)sys.setdefaultencoding("utf-8") impor ...
- position:sticky属性测试
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【HTML5】Canvas绘制基础
什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...
- [转] 如何用BSP树生成游戏地图
作者:Timothy Hely 当用对象随机填充某个区域如地下城中的房间时,你可能会遇到的问题是太过随机,导致分布疏密不均或混乱.在本教程中,我将告诉大家如何使用二进制空间划分法(游戏邦注:即Bina ...
- bzoj 1898 [Zjoi2005]Swamp 沼泽鳄鱼——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 当然是邻接矩阵做转移矩阵来快速幂. 对于鳄鱼,好在它们周期的lcm是12,也就是每12 ...
- url出现特殊字符,需要进行编码
1) 网络访问请求:中文空格字符编码/解码 stringByAddingPercentEscapesUsingEncoding(只对 `#%^{}[]|\"<> 加空格共14个字 ...
- python3入门
简介 计算机基本概念与程序设计语言分类 python风格指南 基础语法 python3 基础语法:基本输入输出 python3 基础语法:标识符和保留字 python3 基础语法:注释 python3 ...