最短路:带限制的最短路,邻接表建图,dijkstra ZOJ 3946+HDU 2680 (简单点的)
来源:互联网 发布:竖笛指法软件 编辑:程序博客网 时间:2024/06/08 06:06
单源最短路,但是要求出在最短路的限制下,所需要的话费也要最少
故比平常的算法多加个优先队列,也就是优先处理那些发费小的,然后处理过就标记了就行了,下次就不会再去处理了
代码如下。也不是很懂,回头再看
#include<stdio.h>#include<queue>using namespace std;#include<string.h>long long u[200010];long long d[200010];long long w[200010];long long first[200010];long long next[200010];long long dis[200010];long long vis[200010];struct node{ long long x,d,w; node(long long x,long long d,long long w):x(x),d(d),w(w) {}; bool operator<(const node &a)const { if(d==a.d) return w>a.w; else return d>a.d; }};int main(){ long long test; scanf("%lld",&test); while(test--) { //memset(vis,0,sizeof(vis)); long long n,m; scanf("%lld%lld",&n,&m); for (long long i = 0; i <= n; i++) dis[i] = first[i] = -1, vis[i] = 0; long long count=0; for(long long i=1; i<=m; i++) { long long x,y,a,b; scanf("%lld%lld%lld%lld",&x,&y,&a,&b); u[count]=y; d[count]=a; w[count]=b; next[count]=first[x]; first[x]=count++; u[count]=x; d[count]=a; w[count]=b; next[count]=first[y]; first[y]=count++; } priority_queue<node>q; q.push(node(0,0,0)); dis[0]=0; long long ansd=0; long long answ=0; while(!q.empty()) { node now=q.top(); q.pop(); if(vis[now.x]==1) continue; else vis[now.x]=1; ansd+=now.d; answ+=now.w; for(long long i=first[now.x]; i!=-1; i=next[i]) { if(dis[u[i]]==-1||dis[u[i]]>=now.d+d[i]) { dis[u[i]]=now.d+d[i]; q.push(node (u[i], dis[u[i]], w[i])); } } } printf("%lld %lld\n",ansd,answ); }}
HDU 2680
反向遍历
#include<stdio.h>#include<queue>using namespace std;#include<string.h>#define INF 0x3f3f3f3flong long u[100010];long long d[100010];long long w[100010];long long first[100010];long long nextt[100010];long long dis[100010];long long vis[100010];struct node{ long long x,d; node(long long x,long long d):x(x),d(d) {}; bool operator<(const node &a)const { if(d==a.d) return x<a.x; else return d > a.d; }};int main(){ //memset(vis,0,sizeof(vis)); long long n,m,s; while( scanf("%lld%lld%lld",&n,&m,&s)!=EOF) { for (long long i = 0; i <= n; i++) dis[i] =INF,first[i] = -1, vis[i] = 0; long long count=0; for(long long i=1; i<=m; i++) { long long x,y,a,b; scanf("%lld%lld%lld",&x,&y,&a); u[count]=x; d[count]=a; nextt[count]=first[y]; first[y]=count++; } priority_queue<node>q; dis[s]=0; q.push(node(s,dis[s])); while(!q.empty()) { node now=q.top(); q.pop(); for(long long i=first[now.x]; i!=-1; i=nextt[i]) { if(dis[u[i]]>now.d+d[i]) { dis[u[i]]=now.d+d[i]; q.push(node (u[i], dis[u[i]])); } } }// for(long long i=1; i<=n; i++)// printf("%d\n",dis[i]); long long t; long long minn=INF; scanf("%lld",&t); while(t--) { long long kk; scanf("%lld",&kk); minn=min(minn,dis[kk]); } if(minn==INF) printf("-1\n"); else printf("%lld\n",minn); }}
0 0
- 最短路:带限制的最短路,邻接表建图,dijkstra ZOJ 3946+HDU 2680 (简单点的)
- ZOJ Problem Set - 3946 (限制的最短路)
- dijkstra+限制最短路
- poj1724(带限制的最短路)
- 最短路模板(dijkstra+邻接表)
- hdu 2680最短路dijkstra
- BZOJ 1922 大陆争霸 (带限制的最短路)
- 热爱工作的蒜蒜(带限制最短路)
- HDU 2544 最短路 (简单的最短路)
- 【hdu 2066】 一个人的旅行 ( 最短路 Dijkstra)
- HDU 2066-一个人的旅行(最短路Dijkstra)
- HDU 2066 一个人的旅行 (最短路----floyd && dijkstra)
- HDU 2066 一个人的旅行(最短路dijkstra)
- HDU 2066 一个人的旅行 (最短路--Dijkstra算法)
- HDU3768限制最短路(有必经过的点)
- HDU 2544 最短路 (最短路 Dijkstra)
- HDU 2544 最短路(简单Dijkstra)
- HDU 2544 最短路(单源最短路 dijkstra / floyd / dijkstra(堆优化)/dijkstra+邻接链表+堆优化)
- Python学习笔记08
- 虚拟化工具
- Redis的具体使用-Redis学习笔记二
- 步入python与Opencv
- android绘图常用方法归纳
- 最短路:带限制的最短路,邻接表建图,dijkstra ZOJ 3946+HDU 2680 (简单点的)
- Java编程中“为了性能”需做的26件事
- KDDCUP历年主题
- 隐马尔科夫模型
- Vmware虚拟机网络设置
- spoj16935 Straight Line Spiral Pattern (Act 3)
- 函数名 和 自己定义的普通函数指针 辨析
- LeetCode——048
- php通过curl post和get发送json数据实例 curl命令转为php源码