大致题意:

有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. ASP.NET 微信公众平台模板消息推送功能完整开发

    最近公众平台的用户提出了新需求,他们希望当收到新的邮件或者日程的时候,公众平台能主动推送一条提醒给用户.看了看平台提供的接口,似乎只有[模板消息]能尽量满足这一需求,但不得不说微信提供的实例太少,而且 ...

  2. AS3.0 扑克牌乱序排列法洗牌

    package { /* *@ClassName:package::PokerMain *@Intro:这是一个初始化1-52扑克牌,然后进行乱序排列进行洗牌: *@Author:非若 *@Date: ...

  3. YoC云上芯片家族迎来新成员

    Espressif 乐鑫信息科技(以下简称乐鑫科技)近日在上海召开发布会,发布其旗下最新的旗舰同时也是第二代Yun on Chip(简称YoC)云上芯片ESP32.YoC云上芯片是由YunOS牵头,联 ...

  4. 验证码识别 Tesseract的简单使用和总结

    Tesseract是什么 OCR即光学字符识别,是指通过电子设备扫描纸上的打印的字符,然后翻译成计算机文字的过程.也就是说通过输入图片,经过识别引擎,去识别图片上的文字.Tesseract是一种适用于 ...

  5. 【airtest】报错:requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')),解决方法如下

    1. 环境及设备:mac, xcode , iphonex 2. 最近出现一个让人费解的问题,airtest 没跑多长时间,服务就断掉,而且总是报“requests.exceptions.Connec ...

  6. NYOJ-1013除法表达式

    除法表达式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 给出一个这样的除法表达式:X1/X2/X3/···/Xk,其中Xi是正整数.除法表达式应当按照从左到右的顺 ...

  7. N3-1 - 数组 - convert-sorted-array-to-binary-search-tree

    题目描述: Given an array where elements are sorted in ascending order, convert it to a height balanced B ...

  8. ELO kernels 记录

    these kernel for discuss how to handle outliers in target values. 一:Ashish Gupta: 在16年6月到18年8月,激活卡的人 ...

  9. yii2-dingtalk 钉钉群机器人

    说明 群机器人是钉钉群的高级扩展功能.群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步.目前,大部分机器人在添加后,还需要进行Webhook配置,才可正常使用(配置说明详见操作流程中的 ...

  10. 【codeforces 731D】80-th Level Archeology

    [题目链接]:http://codeforces.com/contest/731/problem/D [题意] 给你n个象形文; 每个象形文由l[i]个数字组成; 你可以把所有的组成象形文的数字同时增 ...