【题解】Paid Roads [SP3953] [Poj3411]

传送门:\(\text{Paid}\) \(\text{Roads}\) \(\text{[SP3953]}\) \(\text{[Poj3411]}\)

【题目描述】

给出一张 \(n\) 个点 \(m\) 条边的有向图。对于每条边 \((x,y)\),如果之前经过 \(z\) 点,那么费用为 \(p\),否则为 \(r\)。求 \(1\) 到 \(n\) 的最小费用。如果无法到达则输出 “ \(\text{impossible}\) ”。

【样例】

样例输入:
4 5
1 2 1 10 10
2 3 1 30 50
3 4 3 80 80
2 1 2 10 10
1 3 2 10 50 样例输出:
110

【数据范围】

\(100 \%:\) \(1 \leqslant n,m \leqslant 10,\) \(0 \leqslant p_i,r_i \leqslant 100\)


【分析】

由于边的费用涉及到了是否经过某个点, 而且\(n\) 较小,因此可以考虑状压。

将每个点 \(i\) 分为 \(2^n-1\) 层,第 \(j\) 层表示当前在第 \(i\) 个点,状态为 \(j\)(二进制第 \(k\) 位为 \(1\) 就表示已经经过了点 \(k\),\(0\) 表示还未经过)的状态,跑一遍 \(\text{dijkstra}\) 或者 \(\text{SPFA}\) 即可。

也可以开一个二维的 \(\text{dis}\) 数组,\(dis[i][j]\) 表示当前在点 \(i\),状态为 \(j\) 的最短路,在最短路算法里面按照 \(j\) 分类更新 \(dis\)。

另外注意一下坑点:每个点可经过多次。

个人喜欢把所有的点全部建好,直接跑裸的最短路(就像写网络流那样)。

第二种写法代码就不放了。

【Code】

#include<algorithm>
#include<cstdio>
#include<queue>
#define LL long long
#define Re register int
using namespace std;
const int N=10300,M=2e4+3,inf=2e9;
int n,m,x,y,z,p,r,o,V,ans,dis[N],pan[N],head[N];
struct QWQ{int x,d;inline bool operator<(QWQ O)const{return d>O.d;}};
struct QAQ{int w,to,next;}a[M<<1];priority_queue<QWQ>Q;
inline void add(Re x,Re y,Re z){a[++o].w=z,a[o].to=y,a[o].next=head[x],head[x]=o;}
inline void in(Re &x){
Re f=0;x=0;char c=getchar();
while(c<'0'||c>'9')f|=c=='-',c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=f?-x:x;
}
inline void dijkstra(Re st){
for(Re i=0;i<=n*V;++i)dis[i]=inf,pan[i]=0;//注意初始化时应扫描到n*V
Q.push((QWQ){st,dis[st]=0});
while(!Q.empty()){
Re x=Q.top().x;Q.pop();
if(pan[x])continue;
pan[x]=1;
for(Re i=head[x],to;i;i=a[i].next)
if(dis[to=a[i].to]>dis[x]+a[i].w)
Q.push((QWQ){to,dis[to]=dis[x]+a[i].w});
}
}
inline int Poi(Re i,Re j){return j+(i-1)*V;}//当前在点i状态为j
int main(){
// freopen("123.txt","r",stdin);
in(n),in(m),V=(1<<n)-1;
while(m--){
in(x),in(y),in(z),in(p),in(r);
for(Re j=0;j<=V;++j)
if(j&(1<<x-1))//如果j中包含了x,由于点可经过多次,所以不必判断y的情况
if(j&(1<<z-1))add(Poi(x,j),Poi(y,j|(1<<y-1)),p);//已经经过了z
else add(Poi(x,j),Poi(y,j|(1<<y-1)),r);//还没有经过z
}
dijkstra(Poi(1,1));ans=inf;//出发点为:只经过了1的状态,当前在点1
for(Re j=0;j<=V;++j)ans=min(ans,dis[Poi(n,j)]);
if(ans==inf)puts("impossible");
else printf("%d\n",ans);
}

【题解】Paid Roads [SP3953] [Poj3411]的更多相关文章

  1. 多次访问节点的DFS POJ 3411 Paid Roads

    POJ 3411 Paid Roads Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6553   Accepted: 24 ...

  2. poj3411 Paid Roads

    思路: 搜索.注意点和边都有可能经过多次. 实现: #include <iostream> #include <cstdio> #include <vector> ...

  3. Paid Roads POJ - 3411

    A network of m roads connects N cities (numbered from 1 to N). There may be more than one road conne ...

  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 ...

  5. POJ 3411 Paid Roads(DFS)

    题目链接 点和边 都很少,确定一个界限,爆搜即可.判断点到达注意一下,如果之前已经到了,就不用回溯了,如果之前没到过,要回溯. #include <cstring> #include &l ...

  6. POJ 3411 Paid Roads(SPFA || DFS)

    题目链接 题意 : 要从1城市到n城市,求最短路是多少,从a城市到达b城市的路程,如果你到过c城市,则需要走p,否则走r长. 思路 : 因为可以来回走,所以不能用单纯的最短路,可以用二维SPFA,状态 ...

  7. poj 3411 Paid Roads

    题意:有m条路,n座城市,走这些路是要付费的,每条路由两种付费方案,设一条路两端是a,b,如果走完这条路在b点付费的话,应付r,如果走这条路之前在c点付费的话,应付p,求从1端点走到n端点的最小费用. ...

  8. 题解-Codeforces671D Roads in Yusland

    Problem Codeforces-671D 题意概要:给定一棵 \(n\) 点有根树与 \(m\) 条链,链有费用,保证链端点之间为祖先关系,问至少花费多少费用才能覆盖整棵树(\(n-1\) 条边 ...

  9. 题解-CodeForces835F Roads in the Kingdom

    Problem CodeForces-835F 题意:求基环树删去环上任意一边后直径最小值,直径定义为所有点对最近距离的最大值 Solution 首先明确删去环上一点是不会影响树内直径的,所以应当先把 ...

随机推荐

  1. wpf 窗体添加背景图片

    方法一:xaml中:<控件>   <控件.Background><ImageBrush ImageSource="/WpfApplication1;compon ...

  2. 第五篇:Python函数基础篇

    本篇介绍什么是函数.函数的特性.函数的定义.函数的调用.以及函数的参数.以及关于全局变量和局部变量的使用等等. 一.什么是函数: 函数是最基本的一种代码抽象方式,为了实现某种特定的功能而组织的带名字的 ...

  3. Apicloud微信支付iOS可以,安卓返回-1的之避坑指南

    相信各位小伙伴在接入微信支付的时候,一定遇到过返回-1的这个问题,说实话,这个问题真的很恶心,微信开放平台提供的文档在关于-1这个问题的描述(可能的原因:签名错误.未注册APPID.项目设置APPID ...

  4. odoo10学习笔记六:工作流、安全机制、向导

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189289.html 一:工作流 工作流是与业务流程相关联的模型,可用于跟踪工序的动态演变过程. 工作流. ...

  5. mysql-5..6.23-win64.zip安装及配置

    MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行.但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的.很多人下了zip格式的解压发现没有setup.exe,面对一堆文件一头雾 ...

  6. 02-MySQL 介绍和安装

    MySQL 介绍和安装 1.什么是数据? 数据: 文字.图片.视频...人类认知的数据表现方式 计算机: 二进制.16进制的机器语言 基于数据的重要性和复杂性的不同,我们可能有不同的管理方式. 哪些数 ...

  7. Rust自定义智能指针

    深了,真深了. use std::ops::Deref; struct MyBox<T>(T); impl<T> MyBox<T> { fn new(x: T) - ...

  8. hbase配置hdfs的HA之后需要修改的路径

    hbase-site.xml中配置了hdfs的一个路径 <property> <name>hbase.rootdir</name> <value>hdf ...

  9. day45 作业

    一.将当前日期按"2017-12-27 11:11 星期三"格式输出 function getdate(){ var d = new Date(); year = d.getFul ...

  10. 实验1 C语言开发环境和数据类型、运算符、表达式

    #include <stdio.h> int main () { int x; printf("输入一个整数:\n"); scanf("%d",&a ...