POJ 3411
来源:互联网 发布:官方软件 编辑:程序博客网 时间:2024/06/06 01:22
我感觉DFS就是两个方面 一个是剪枝 另一个就是DFS的路径标记问题:首先这道题目有可能一条路不止走一次 多以不可以标记路,但是有不得不标记,要是不标记就无限循环了,所以我们考虑用一个数组计算在某一种走法下路过城市的次数,我是这样想的:因为m<=10,及某个点为中心画环(至少3个元素,应为两个元素的没有必要考虑)最多在画4个环(其他的点最多出现在一个环中间)当然话的时候请带箭头从1指到10,所以这个访问次数就却定最多为4,以下是代码:
#include<iostream>#include<string.h>#define INF 100000int v[11],n,m,minpay;struct{ int a,b,c,p,r;}road[11];using namespace std;void dfs(int city,int sum){ //cout<<sum<<endl; if(city==n){ if(minpay>sum) minpay=sum; return; } for(int j=1;j<=m;j++){ if(road[j].a==city/*&&v[road[j].a]<3*/&&v[road[j].b]<=4){ v[road[j].b]++; if(v[road[j].c]>=1){ // cout<<"j="<<j<<endl; dfs(road[j].b,sum+road[j].p); } else { //cout<<"j="<<j<<endl; dfs(road[j].b,sum+road[j].r); } v[road[j].b]--; } } return ;}int main(){ while(cin>>n>>m){ for(int i=1;i<=m;i++) cin>>road[i].a>>road[i].b>>road[i].c>>road[i].p>>road[i].r; memset(v,0,sizeof(v)); v[1]=1; minpay=INF; dfs(1,0); if(minpay==INF) cout<<"impossible"<<endl; else cout<<minpay<<endl; } return 0;}
0 0
- poj 3411
- POJ 3411
- poj-3411
- poj 3411
- Poj 3411 Paid Roads
- poj 3411 搜索+剪枝
- poj 3411 dfs
- POJ 3411 Paid Roads
- poj 3411 Paid Roads
- POJ 3411 Paid Roads
- poj 3411 Paid Roads
- poj 3411 Paid Roads
- POJ 3411 - Paid Roads
- POJ 3411(搜索)
- POJ 3411 BFS+状压
- POJ-3411-Paid Roads
- POJ 3411 Paid Roads
- POJ 3411 Paid Roads
- 百度搜索V认证生存浅析
- 【转】android生成项目后出现两个图标或点击程序提示未安装的解决办法
- 第五周项目1-三角形类的构造函数(1)
- Oracle数据块损坏恢复总结
- 从分层思想到SSH架构的使用
- POJ 3411
- flex十大未解之谜
- android进行网络连接时出现服务器拒绝访问的可能解决法
- unity3D中常用的几种系统自调用的重要方法
- Chromium开源项目的代码统计
- cf404D Minesweeper 1D 状态转移dp
- dex relate files
- 导出excel功能,较通用的一种实现
- 黑马程序员 Java基础之IO流<一>File类及递归