题目链接:

id=3411">点击打开链接

题目大意:有n个点。m条有向边,经过边须要一个花费,a b c p q代表 a到b的一条道路,假设经过这条边之前经过c点,那么须要p的花费,否则须要q的花费。问从1点到n点的最小花费。

方法1、每条边可能会经过多次,每一个点也能够经过多次,这样就没有了边界不能直接进行dfs,由于要记录之前经过的边。所以使用状压,dis[i][j]:当前在第i个点。j表示经过了的点,这样就能够得到推导的公式,按spfa的方式。跑出最短路

方法2、最多仅仅有10个点,那么假设1个点被反复经过3次以上,那么再经过它就仅仅会添加最小值,不会优化结果,也就是一个闸值,所以控制訪问点的次数。直接dfs+剪枝就能求解

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std ;
#define INF 0x3f3f3f3f
struct nn{
int a , b , c , p , q ;
int next ;
}edge[20];
int head[20] ,cnt ;
int n , m , min1 ;
struct node{
int a , k ;
int w ;
} node_p , node_q ;
queue <node> que ;
int vis[12][1100] , dis[12][1100] ;
void add(int a,int b) {
edge[cnt].a = a ; edge[cnt].b = b ;
scanf("%d %d %d", &edge[cnt].c, &edge[cnt].p, &edge[cnt].q) ;
edge[cnt].next = head[a] ; head[a] = cnt++ ;
}
int main() {
int i , a , b , c ;
while( scanf("%d %d", &n, &m) != EOF ) {
memset(head,-1,sizeof(head)) ;
memset(vis,0,sizeof(vis)) ;
memset(dis,INF,sizeof(dis)) ;
cnt = 0 ;
while( m-- ) {
scanf("%d %d", &a, &b) ;
add(a,b) ;
}
while( !que.empty() ) que.pop() ;
vis[1][1] = 1 ;
dis[1][1] = 0 ;
node_p.a = 1 ; node_p.k = 1 ;
node_p.w = 0 ;
que.push(node_p) ;
while( !que.empty() ) {
node_p = que.front() ;
que.pop() ;
//printf("bbiu--> %d %d\n", node_p.a, node_p.k) ;
vis[ node_p.a ][ node_p.k ] = 0 ;
for(i = head[ node_p.a ] ; i != -1 ; i = edge[i].next) {
b = edge[i].b ;
c = 1<<(edge[i].c-1) ;
if( node_p.k & c ){
if( dis[ node_p.a ][ node_p.k ] + edge[i].p < dis[ edge[i].b ][ node_p.k ] ) {
dis[ edge[i].b ][ node_p.k ] = dis[ node_p.a ][ node_p.k ] + edge[i].p ;
if( !vis[ edge[i].b ][ node_p.k ] ) {
vis[ edge[i].b ][ node_p.k ] = 1 ;
node_q.a = edge[i].b ;
node_q.k = node_p.k ;
node_q.w = dis[ edge[i].b ][ node_p.k ] ;
que.push(node_q) ;
}
}
}
else {
if( dis[ node_p.a ][ node_p.k ] + edge[i].q < dis[ edge[i].b ][ node_p.k|c ] ) {
dis[ edge[i].b ][ node_p.k|c ] = dis[ node_p.a ][ node_p.k ] + edge[i].q ;
if( !vis[ edge[i].b ][ node_p.k|c ] ) {
vis[ edge[i].b ][ node_p.k|c ] = 1 ;
node_q.a = edge[i].b ;
node_q.k = node_p.k|c ;
node_q.w = dis[ edge[i].b ][ node_p.k|c ] ;
que.push(node_q) ;
}
}
}
}
}
min1 = INF ;
for(i = 0 ; i < (1<<n) ; i++){
min1 = min(min1,dis[n][i]) ;
//printf("n - i == %d , %d \n", i, dis[n][i]) ;
}
if( min1 == INF )
printf("impossible\n") ;
else
printf("%d\n", min1) ;
}
return 0 ;
}

poj3411--Paid Roads(bfs+状压)的更多相关文章

  1. 孤岛营救问题 (BFS+状压)

    https://loj.ac/problem/6121 BFS + 状压 写过就好想,注意细节debug #include <bits/stdc++.h> #define read rea ...

  2. hdu 5094 Maze (BFS+状压)

    题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi    含义是(x1,y1)与(x2,y2)之间有gi ...

  3. hdu 4771 Stealing Harry Potter's Precious (BFS+状压)

    题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...

  4. 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP

    这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...

  5. HDU 5025:Saving Tang Monk(BFS + 状压)

    http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description   <Journey to ...

  6. hdu 4856 Tunnels (bfs + 状压dp)

    题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...

  7. 【HDU 4771 Stealing Harry Potter's Precious】BFS+状压

    2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点, ...

  8. hdu 2209 bfs+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...

  9. HDU-4856 Tunnels (BFS+状压DP)

    Problem Description Bob is travelling in Xi’an. He finds many secret tunnels beneath the city. In hi ...

随机推荐

  1. 模板:统计1~n内x的个数

    http://noi.openjudge.cn/ch0105/40/ 40:数1的个数-拓展变形 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个十进 ...

  2. 测试工具APPScan安装与使用教程

  3. Jmeter实时性能测试数据的监控

    Jmetet实时性能测试数据的监控和展示Jmeter Grafana InfluxDB 安装Grafana配置jmeter安装InfluxDB配置Grafana展示数据一安装InfluxDB 为了方便 ...

  4. 关于MapControl和PageLayout地图同步的问题

    按照ArcMap的处理方式,地图和制图是分两个页面的,他们之间通过共享同一个Map对象来实现地图同步,具体做法就是在PageLayoutControl的PageLayoutReplaced事件发生时, ...

  5. 关于UIWebView设置高度自适应的问题

    - (void)viewDidLoad { [super viewDidLoad]; _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMa ...

  6. Facebook KeyHash生成方法

    1. 去https://code.google.com/p/openssl-for-windows/downloads/list下载OpenSSL工具 2.  在C盘根目录下新建一个openssl的文 ...

  7. python软件工程知识

    软件工程知识 3.1 程序设计过程中,常用伪代码来"思考"一个程序,在将伪代码程序转换成python程序. 3.2 所有python程序都可以给予6类控制结构来创建(顺序,if, ...

  8. display:inline-block;在各浏览器下的问题和终极兼容办法

    display:inline-block;在各浏览器下的问题和终极兼容办法 一.IE 5.5.6.7 .8(Q)中display:inline-block;失效 兼容办法: IE 5.5.6.7 .8 ...

  9. CSDN日报20170413 ——《天天写业务代码的那些年,我们是怎样成长过来的》

    [程序人生]天天写业务代码的那些年,我们是怎样成长过来的 作者:Phodal 比起写业务代码更不幸的是,主要工作是修 Bug , bug , buG , bUg. [Java 编程]Springboo ...

  10. Java源码中遇到的一些问题(更新中)

    1子类和父类实现同样的接口,这样做有什么意义吗? 举例:Vector和AbstractList的类签名 public class Vector<E> extends AbstractLis ...