大致题意:

有n座城市和m(1<=n,m<=10)条路。现在要从城市1到城市n。有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱,如果没有去过就付R的钱。求的是最少要花多少钱。

注意:路径是有向的。

解题思路:

DFS。这题当有了思路后,做起来是没有难度的,但是思维推算能力要求很高。

这题难点在于“城市与城市之间可能存在多条路径”:

1、 输入数据时可能会出现多条 从城市a到城市b的路径信息,但是费用有所差别;

2、 对于 从城市a到城市b 的同一条路径,允许重复走。

有人会问,重复走同一条路径有什么意义?单纯增加费用而已,为什么不能标记所有路径,每条路只允许走一次,这样费用不是更少么?

我开始也是陷入了这种思维,但是这种想法其实“对一半,错一半”。

先来看一组数据:

6 5

1 2 1 10 10

2 3 4 10 100

2 4 2 15 15

4 1 1 12 12

3 6 6 10 10

如果每条路只允许走一次,那么方案只有1个:

1à2à3à6 共135元

但这组数据的正确答案是67元。为什么?正确的方案如下:

1à2à4à1à2à3à6 共67元

显然1à2重复走了一次,目的是为了先到达城市4,从而使得2à3这段路的费用从100缩减到10元。

转载自:優YoU http://blog.csdn.net/lyy289065406/article/details/6689310

因为就10个点,100条边。

考虑DFS

我们考虑有没有环路的时候不一定非要标记一个点被访问了多少次。

(个人认为这样并不科学)

小優YoU(这应该叫前辈了吧)说:

那么应该重复多少次才合理?这与m值有关。题目的m值范围为<=10,那么当人一个城市被到达的次数若 >3次(不包括3),所走的方案必然出现了环路(网上的同学称之为“闸数”)。因此只需把bool vist[] 修改为 int vist[] 进行标记,本题就能解决了。

但是并没有说出为什么一个点被访问3次就不能更优了,,

所以我认为这是数据水,卡过去的。。

我是把所有的vis设成m,每个点m次,,肯定所有的最优环都包括了。

加个剪枝:if(cost>ans)return;

也是0ms。。。。。

// by SiriusRen
#include <cstdio>
using namespace std;
int n,m,xx,yy,p,r,ans=0x3fffffff,vis[105],P[105],R[105];
int first[15],next[105],v[105],C[105],VIS[105];
void dfs(int x,int cost){
VIS[x]++;
if(cost>ans)return;
if(x==n&&ans>cost)ans=cost;
for(int i=first[x];i;i=next[i])
if(VIS[v[i]]<=m){
if(VIS[C[i]])dfs(v[i],cost+P[i]);
else dfs(v[i],cost+R[i]);
VIS[v[i]]--;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d%d",&p,&v[i],&C[i],&P[i],&R[i]);
next[i]=first[p],first[p]=i;
}
VIS[1]=1,dfs(1,0);
if(ans!=0x3fffffff)printf("%d\n",ans);
else puts("impossible");
}

但是还有几个版本莫名其妙AC,,,

1.

统计每个边经过的次数,次数小于等于2。

0msAC

// by SiriusRen
#include <cstdio>
using namespace std;
int n,m,xx,yy,p,r,ans=0x3fffffff,vis[105],P[105],R[105];
int first[15],next[105],v[105],C[105],VIS[105];
void dfs(int x,int cost){
if(x==n&&ans>cost)ans=cost;
for(int i=first[x];i;i=next[i])
if(vis[i]<=1){
vis[i]++,VIS[v[i]]++;
if(VIS[C[i]])dfs(v[i],cost+P[i]);
else dfs(v[i],cost+R[i]);
vis[i]--,VIS[v[i]]--;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d%d",&p,&v[i],&C[i],&P[i],&R[i]);
next[i]=first[p],first[p]=i;
}
VIS[1]=1,dfs(1,0);
if(ans!=0x3fffffff)printf("%d\n",ans);
else puts("impossible");
}

2.统计每个点经过的次数。

次数小于等于3. 这里就不放代码了。。。 网上一抓一大把

乱做实验的后果,,,

POJ 3411 DFS的更多相关文章

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

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

  2. poj 3411 Paid Roads很水的DFS

    题意:给你N 城市和M条道路,每条道路要付的钱,但是如果你在这个道路上你可以付其他道路的钱(跟走到的时候去的话不一样),问你从1走到N最少话费是多少. 直接DFS搜. 链接http://poj.org ...

  3. POJ 3411 Paid Roads(DFS)

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

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

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

  5. poj 3411 Paid Roads(dfs)

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

  6. 广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告

    题目链接:http://poj.org/problem?id=3411 题目意思:N个city 由 m 条路连接,对于一条路(假设连接Cityia和 Cityb),如果从Citya 去 Cityb的途 ...

  7. POJ 1321 DFS

    题意:POJ少见的中文题,福利啊. 思路: 一开始也没有思路呃呃呃 . 裸搜,连样例都过不去...参照了网上的题解:一行一行DFS 茅塞顿开啊. #include <cstdio> #in ...

  8. POJ 1979 dfs和bfs两种解法

      fengyun@fengyun-server:~/learn/acm/poj$ cat 1979.cpp #include<cstdio> #include<iostream&g ...

  9. poj 1190 DFS 不等式放缩进行剪枝

    F - (例题)不等式放缩 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submi ...

随机推荐

  1. HashMap以及ConcurrentHashMap

    HashMap源码相关 HashMap实现原理及源码分析 总之就是这个博客,简直就是源码带逛,开心,最关键的是下面的图像 另外,自己的理解加上源码,总结如下 hash,原义散列,就是一对一: hash ...

  2. JavaScript 消息框

    警告框 alert(); 确认框 var message=confirm("你喜欢javascript吗"); if(message==true){ document.write( ...

  3. /usr/bin/ld: cannot find -lxxx 问题 解决方法总结

    最近在做毕设的收尾工作,很多程序都要部署到linux下来运行,遇到了挺多问题,昨天就集中性遇到了 在编译应用时,遇到了 /usr/bin/ld: cannot find -lxxx 这种情况是系统找不 ...

  4. Java中数组的概念与特点

    数组概念: 数组其实也是一个容器,可以用来存储固定个数相同类型的数据数组的定义 数组中存储的数据叫做元素 特点: 1.数组是引用数据类型 2.数组的长度是固定的,也就是说可以存储固定个数的数据 3.数 ...

  5. java 常用API

    package com.orcal.demc01; public class Regex { public static void main(String[] args) { // TODO Auto ...

  6. flex笔记 - 基础

    flex笔记 - 基础 文章中的所有图示代码都放在了github上: 阮一峰flex博客跟学代码 传统的布局解决方案,基于盒模型, 依赖 display, position, float属性来进行布局 ...

  7. Redis 报错:MISCONF Redis is configured to save RDB snapshots

    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Com ...

  8. Python for Xpath

    # Xpath- 在XML文件中查找信息的一套规则/语言,根据XML的元素或者属性进行遍历 ## Xpath开发工具- 开源的Xpath表达式编辑工具:XMLQuire- Chrome插件:Xpath ...

  9. CCPC2018秦皇岛游记

    Day1 27号晚上8点多的火车. 然后..第二天(28号)6点40左右的样子到了天津(中转站) 然后一顿乱拍. 看到宝葫芦了没:) 然后.看到了狗不理包子铺...不过当时没开门,就溜了. 然后去秦皇 ...

  10. HDU2161 Primes

    /* HDU2161 Primes http://acm.hdu.edu.cn/showproblem.php?pid=2161 数论 水题 注意输入截止条件是n<=0 */ #include ...