poj1724——ROADS
来源:互联网 发布:身份证合成软件 编辑:程序博客网 时间:2024/06/06 19:44
题目:Bob想从城市1去城市N,这些城市间有一些长度和花费不同的路共R条,两个城市之间可以有很多路(单向路),Bob只有K枚硬币,问他的最短路径
输入:K(0 <= K <= 10000)
N(2 <= N <= 100)
R(1 <= R <= 10000)
第i条路的描述(共R行,S D L T分别代表起点、终点、路长( 1 <= L <= 100 )、开销(0 <= T <=100))
输出:最短路径长度(如果不存在输出-1)
分析:dfs+剪枝/bfs+优先级队列
代码:转载自http://blog.csdn.net/riba2534/article/details/70169857
以下是dfs+剪枝的方法:
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #define mem(a,b) memset(a,b,sizeof(a))
- #define inf 0x3f3f3f3f
- #define N 100+20
- #define M 1000000+10
- using namespace std;
- int first[N], vis[N];
- int k,n,m,len,sum;
- struct node
- {
- int u,v,w,cost;
- int next;
- } g[10200];
- void add_edge(int u,int v,int w,int cost)//邻接表建图
- {
- g[len].v=v;
- g[len].w=w;
- g[len].cost=cost;
- g[len].next=first[u];
- first[u]=len++;
- }
- void dfs(int x,int step,int cost)//当前城市x 当前距离step 当前花费cost
- {
- if(cost>k||step>sum)//剪枝条件,花费大于拥有的钱数和步数大于当前最小的步数
- return;
- if(x==n)
- sum=min(sum,step);//更新步数最小值
- for(int i=first[x]; i!=-1; i=g[i].next)
- {
- int v=g[i].v;
- if(!vis[v])
- {
- vis[v]=1;
- dfs(v,step+g[i].w,cost+g[i].cost);
- vis[v]=0;
- }
- }
- }
- int main()
- {
- len=0;
- int a,b,c,d;
- mem(vis,0);
- mem(first,-1);
- scanf("%d%d%d",&k,&n,&m);
- for(int i=0; i<m; i++)
- {
- scanf("%d%d%d%d",&a,&b,&c,&d);
- add_edge(a,b,c,d);
- }
- sum=inf;
- dfs(1,0,0);
- if(sum==inf)
- puts("-1");
- else
- printf("%d\n",sum);
- return 0;
- }
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #include <algorithm>
- #define mem(a,b) memset(a,b,sizeof(a))
- #define inf 0x3f3f3f3f
- #define N 100+20
- #define M 1000000+10
- using namespace std;
- int k,n,m,len,sum;
- int first[N],dis[N][10005];
- struct node1
- {
- int v,dis,cost,next;
- } g[10010];
- struct node
- {
- int num,dis,cost;
- bool friend operator < (node a,node b)//重载运算符
- {
- return a.dis>b.dis;
- }
- };
- void add_edge(int u,int v,int dis,int cost)//邻接表建图
- {
- g[len].v=v;
- g[len].dis=dis;
- g[len].cost=cost;
- g[len].next=first[u];
- first[u]=len++;
- }
- void dijkstra()
- {
- for(int i=1; i<=n; i++)
- for(int j=0; j<=k; j++)
- dis[i][j]=inf;//dis[i][j]表示从点1到点i花费的钱数为j的最短距离
- dis[1][0]=0;
- priority_queue<node>q;
- node now,to;
- now.num=1;
- now.cost=0;
- now.dis=0;
- q.push(now);
- while(!q.empty())
- {
- now=q.top();
- q.pop();
- if(now.num==n)//找到的时候直接输出并返回
- {
- printf("%d\n",now.dis);
- return;
- }
- for(int i=first[now.num]; i!=-1; i=g[i].next)
- {
- int cost=now.cost+g[i].cost;
- if(cost>k)continue;
- if(dis[g[i].v][cost]>now.dis+g[i].dis)//松弛条件
- {
- dis[g[i].v][cost]=now.dis+g[i].dis;
- to.num=g[i].v;
- to.cost=cost;
- to.dis=dis[g[i].v][cost];
- q.push(to);
- }
- }
- }
- puts("-1");
- }
- int main()
- {
- len=0;
- int a,b,c,d;
- mem(first,-1);
- scanf("%d%d%d",&k,&n,&m);
- for(int i=0; i<m; i++)
- {
- scanf("%d%d%d%d",&a,&b,&c,&d);
- add_edge(a,b,c,d);
- }
- dijkstra();
- return 0;
- }
阅读全文
0 0
- poj1724——ROADS
- poj1724——ROADS
- 深搜最短路径+剪枝——POJ1724:ROADS
- poj1724 ROADS
- poj1724 - ROADS
- ROADS poj1724
- POJ1724--ROADS
- POJ1724 ROADS
- POJ1724-ROADS
- poj1724 ROADS
- poj1724 ROADS
- POJ1724 ROADS
- poj1724 ROADS (spfa + A*)
- poj1724 ROADS 解题报告
- poj1724 roads(dfs)
- POJ1724 ROADS最短路问题
- poj1724 openjudge1724 ROADS 解题记录
- 【POJ1724】ROADS 某邪恶最短路
- 高版本CAD画直线时,点击F8正交卡死解决方法
- java连接mysql
- 你不知道的JS-读书笔记(五)--原型[Prototype]
- 使用wkhtmltopdf将网页转换为PDF时echarts图表线条不完整
- 安卓控件工具类
- poj1724——ROADS
- SourceTree 免登录跳过初始设置
- oracle中sql语句查询优化(七)
- Q-learning算法实现
- PTA-玩转二叉树
- Debian9:修改默认网卡为eth0,ifconfig
- Swift-CGRect,CGSize,CGPoint 使用
- 100. Same Tree
- 29、Android 微信分享checkArgs fail, thumbData is invalid