首页 > 其他分享 >poj 3411(DFS多点访问)

poj 3411(DFS多点访问)

时间:2023-05-29 19:32:36浏览次数:41  
标签:pre cnt cur int DFS vis edge poj 3411


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


解题思路:这道题的n与m都很小,dfs可以搞定,但这里与以往的搜索不同,以前dfs每个节点只能够访问一次,这里有多次访问的可能性。很好的是这道题给的是一个有向图,我们只要知道某节点被访问的次数即可,如果访问次数过多,那么肯定是走到了一个环,立即跳出来。。参考了别人的,节点访问次数最多只有3


AC:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int inf = 0x3f3f3f;
struct Edge
{
	int k,c,p,r,next;
}edge[20];
int n,m,cnt,vis[20],pre[20],ans;

void addedge(int a,int b,int c,int p,int r)
{
	edge[cnt].k = b;
	edge[cnt].c = c;
	edge[cnt].p = p;
	edge[cnt].r = r;
	edge[cnt].next = pre[a];
	pre[a] = cnt++;
}

void dfs(int cur,int sum)
{
	if(cur == n)
	{
		if(ans > sum) ans = sum;
		return;
	}
	if(vis[cur] > 3 || sum > ans) return;
	vis[cur]++;
	for(int i = pre[cur]; i != -1; i = edge[i].next)
	{
		int k = edge[i].k;
		if(vis[edge[i].c])
			dfs(k,sum+edge[i].p);
		else dfs(k,sum+edge[i].r);
	}
	vis[cur]--;
}

int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		cnt = 0;
		memset(pre,-1,sizeof(pre));
		memset(vis,0,sizeof(vis));
		for(int i = 1; i <= m; i++)
		{
			int a,b,c,p,r;
			scanf("%d%d%d%d%d",&a,&b,&c,&p,&r);
			addedge(a,b,c,p,r);
		}
		ans = inf;
		dfs(1,0);
		if(ans != inf)
			printf("%d\n",ans);
		else printf("impossible\n");
	}
	return 0;
}




标签:pre,cnt,cur,int,DFS,vis,edge,poj,3411
From: https://blog.51cto.com/u_16143128/6373674

相关文章

  • POJ 1797 Heavy Transportation(迪杰斯特拉最短路变形)
    传送门题意分析:Hugo想要扩展他的公司,他有起重机要到目的地,到达目的地有很多条路径,但是,每一条路都有相应承重量,现在需要找出到达目的地的最大承重道路的承重质量。解题分析:首先,每一条路径的承重量取决于承重量最小的那条道路(短板效应),所以就是找所有路径的最小值,然后选择最小值最大的......
  • POJ 1753 Flip Game(枚举+递归)
    传送门思路是别人的,自己理解了半天,真是渣渣。对于自己,路还长,年轻人。对任意一个格子来说,翻动偶数次等于没翻,翻动奇数次等于翻一次,所以只需考虑翻一次的情况。一共16个格子,每个格子只有翻和不翻,所以最多16步,最少0步,题目要求最少的步数,所以0——>16枚举,看哪一步先成功就是最优解。使......
  • POJ 3069 Saruman's Army(贪心)
    传送门这个题是说给你n个点,然后让你标记其中尽可能少的点,使得n个点都处于被标记点左右不超过R的区间内我们使用的是贪心算法,也就是我们要将被标记的点尽可能的朝右边去即可,首先我们将他们从左到右进行排序,第一个我们所选取的被标记的点应该是能够包含掉左边的点的最靠右的点。。。......
  • CodeForces 1108C Nice Garland(DFS)
    传送门题目大意就是给你一个由'R','G','B'三个字母组成的字符串,然后这个字符串需要满足任意相邻的三个字符不能相同,如果不满足则需要你对其进行更改,然后输出更改的次数和更改完的字符串。具体的思路就是枚举"RGB"这三个的组合,显然只有3!个,然后依次计算步数代码如下#include<iostream>......
  • POJ 1182 食物链
    解题思路:并查集经典中的经典题,在网上看了很多大牛的思路,大部分是增加一个结构体存动物间的关系,结合并查集判断,但是关系域的更新比较复杂,一下子不太容易理解。所以就有人另开思路,这里介绍一个十分巧妙的思路。一般我们都会把一个动物当成一个节点,然后去执行并查集等操作。但是有位大......
  • POJ 2251 Dungeon Master(三维BFS)
    题目看起来很厉害,实际上看懂了并不难,开一个三维的数组,这里需要注意的是第一维是高度,然后就是简单的BFS了,还有不同就是三维的时候有六个方向可以走,在前后左右的基础上多了一个向上和向下的走法,还有一个问题就是多个输入样例要注意每次都要初始化,我做的时候就因为这个WA了好几次,最后......
  • POJ 2080 Calendar
    题目链接:http://poj.org/problem?id=2080题目不是很难,也没什么说的,直接看代码吧:#include<iostream>#include<stdio.h>usingnamespacestd;intyear(intm){ if(m%4==0&&m%100!=0||m%400==0) return1; else return0;}intmain(){ intn,i,j......
  • hdfs文件上传打包及bug汇总
    1、错误:找不到或无法加载主类删除META-INFO下的.DSA和.SF文件即可来源csdn文章2、ERRORorg.apache.hadoop.fs.UnsupportedFileSystemException:NoFileSystemforscheme"file"ConfigurationlocalConf=newConfiguration();//ERRORorg.apache.h......
  • 区分PO、VO、 BO、 DTO、 POJO
     分层领域模型规约:DO(DataObject):此结构与数据库表结构一一对应,通过DTO向上传输数据源对象。DTO(DataTransferObject):数据传输对象,Service或Manager向外传输的对象。BO(BusinessObject):业务对象,由Service层输出的封装业务逻辑的对象。AO(ApplicationObject):应用......
  • hdfs开启回收站(废纸篓)
    1、背景我们知道,在mac系统上删除文件,一般情况下是可以进入废纸篓里的,如果此时我们误删除了,还可以从废纸篓中恢复过来。那么在hdfs中是否存在类似mac上的废纸篓这个功能呢?答案是存在的。2、开启hdfstrash功能当我们启用Trash功能后,从HDFS中删除某些内容时,文件或目录不会......