POJ 3411 Paid Roads(SPFA || DFS)
题意 : 要从1城市到n城市,求最短路是多少,从a城市到达b城市的路程,如果你到过c城市,则需要走p,否则走r长。
思路 : 因为可以来回走,所以不能用单纯的最短路,可以用二维SPFA,状态压缩一下,第二维来记录状态,表示到过这个点的第几个状态。也可以用DFS,因为最多十个点,所以如果走某一个点走过三遍说明就是真的只增加费用了,也就是真正的在走环路了。DFS分析
二维SPFA
#include <stdio.h>
#include <string.h>
#include <queue>
#include <iostream> using namespace std ; struct node
{
int uu ;
int p,r ;
bool vis ;
} mapp[][]; int N,m ;
int dis[][] ;
int cost ;
bool vist[] ;
const int INF = ; int spfa()
{
queue<pair<int,int> >Q ;
Q.push(make_pair(,)) ;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
dis[i][j] = INF ;
memset(vist,false ,sizeof(vist)) ;
dis[][] = ;
while(!Q.empty())
{
int a = Q.front().first ;
int b = Q.front().second ;
Q.pop() ;
vist[a] = false ;
for(int i = ; i <= N ; i++)
{
if(mapp[a][i].vis)
{
if( b & ( << (mapp[a][i].uu-))) cost = mapp[a][i].p ;//減一是為了讓狀態從1開始,1,2,4....
else cost = mapp[a][i].r ;
if(dis[i][b | ( << (mapp[a][i].uu-))] > cost + dis[a][b])
{
dis[i][b | ( << (mapp[a][i].uu-))] = cost + dis[a][b] ;
if(!vist[i])
{
vist[i] = true ;
Q.push(make_pair(i,b | ( << (mapp[a][i].uu-)))) ;
}
}
}
}
}
int minn = INF ;
for(int i = ; i < << N ; i++)
minn = min(minn,dis[N][i]) ;
return minn ;
}
int main()
{
int u,v,uu,p,r ;
while(~scanf("%d %d",&N,&m))
{
for(int i = ; i <= m ; i++)
{
scanf("%d %d %d %d %d",&u,&v,&uu,&p,&r) ;
mapp[u][v].vis = true ;
mapp[u][v].uu = uu ;
mapp[u][v].p = p ;
mapp[u][v].r = r ;
}
int ans = spfa() ;
if(ans < INF)
printf("%d\n",ans) ;
else printf("impossible\n") ;
}
return ;
}
DFS
#include <stdio.h>
#include <string.h>
#include <iostream>
#define oo 9999999
using namespace std ; int N,M ;
struct node
{
int u,v,w ;
int P,R ;
} road[];
int vis[] ,ans; void dfs(int u,int cost)
{
if(u == N && ans > cost)
{
ans = cost ;
return ;
}
for(int i = ; i < M ; i++)
{
if(u == road[i].u && vis[road[i].v] <= )
{
vis[road[i].v] ++ ;
if(vis[road[i].w])
dfs(road[i].v,cost+road[i].P) ;
else dfs(road[i].v,cost+road[i].R) ;
vis[road[i].v] -- ;
}
}
}
int main()
{
while(~scanf("%d %d",&N,&M))
{
for(int i = ; i < M ; i++)
scanf("%d %d %d %d %d",&road[i].u,&road[i].v,&road[i].w,&road[i].P,&road[i].R) ;
memset(vis,,sizeof(vis)) ;
vis[] = ;
ans = oo ;
dfs(,) ;
if(ans == oo)
printf("impossible\n") ;
else
printf("%d\n",ans) ;
}
return ;
}
POJ 3411 Paid Roads(SPFA || DFS)的更多相关文章
- poj 3411 Paid Roads(dfs)
Description A network of m roads connects N cities (numbered to N). There may be more than one road ...
- 多次访问节点的DFS POJ 3411 Paid Roads
POJ 3411 Paid Roads Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6553 Accepted: 24 ...
- 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端点的最小费用. ...
- POJ 3411 Paid Roads (状态压缩+BFS)
题意:有n座城市和m(1<=n,m<=10)条路.现在要从城市1到城市n.有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱, 如果没有去过就付R的钱.求的是最少要花 ...
- HDU 1815, POJ 2749 Building roads(2-sat)
HDU 1815, POJ 2749 Building roads pid=1815" target="_blank" style="">题目链 ...
- 【题解】Paid Roads [SP3953] [Poj3411]
[题解]Paid Roads [SP3953] [Poj3411] 传送门:\(\text{Paid}\) \(\text{Roads}\) \(\text{[SP3953]}\) \(\text{[ ...
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
随机推荐
- 必须知道的.NET FrameWork
这部分内容呢,对普通开发者来说,意义不是特别大.但是作为一个有情怀的开发者,应该追根溯源,懂一些自己用的工具, 的粗浅知识.并且这部分内容可以用来个HR吹嘘一下自己的情怀.基本就是这样. .NET生成 ...
- linux 终端显示 -bash-4.1
解决方法: cp /etc/skel/.bashrc /root/ cp /etc/skel/.bash_profile /root/ 重新登陆就OK了
- 分享:mysql 随机查询数据
在mysql中查询5条不重复的数据,使用以下: 1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了.但是真正测试一下才发现这样效率非常低.一个1 ...
- 重拾C,一天一点点
数据类型及长度 char 字符型,占用一个字节 int 整型,通常代表特定机器中整数的自然长度 short 16位 int 16位或32位 ...
- 集成环境wamp环境下 memcached的安装
早就听说过memcached,但是一直没实践过.所有今天有时间就搞了一下,哎废了我一上午才搞定!一上午啊,好丢人.特写记录一下 先说一下我遇到的问题:按照别人教程(还有好多)说的,安装后没有任何的错误 ...
- AJAX局部更新演出排期
<script language="javascript" type="text/javascript"> function createXMLHt ...
- DataSnap中连接池的应用
当开发人员开始创建Delphi的DataSnap应用时很常见的数据库连接定义方式是每个数据模块建立一个连接.这样做将产生大量的数据库连接,并产生很多问题.从Delphi XE开始,EMB提供了Sess ...
- spring的配置
web.xml的配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&q ...
- sql拆分查询
有这样一个需求: 临时表sql: create table #AA ( ID int, Name nvarchar(20) ) insert #AA select 1,'苏州/上海/温州' union ...
- c#中的ref、out、params参数
out参数 与c++的引用的对比 out参数可以用来传递方法返回值,与c++中的引用有点像,但是还有有些不同: - 调用方法的时候必须写out参数 - 调用方法之前必须先分配空间 - 调用方法之前不用 ...