hrbust 1687买房子 && hrbust 1669回家Ⅱ(二维最短路SPFA)
来源:互联网 发布:网络摄像头电源多少伏 编辑:程序博客网 时间:2024/04/28 10:01
hrbust 1687买房子
城镇编号从1到N,小W起始城镇编号为S,小W希望在T城镇购买房子。
小W希望尽可能早的购买这个房子。请你帮他计算最少需要的时间。
当他经过一条路时,他将通过某种途径获得10金币并且消耗一定时间。
小W需要K金币。所以小W需要收集至少K金币。
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <queue>#define MAXN 50005#define MAXM 100100#define INF 0x1f1f1f1fusing namespace std;int n, m;struct EDGE{ int v, next; int w;}edge[MAXM*2];int head[MAXN], e;int vis[MAXN][650];int d[MAXN][650];void init(){ e = 0; memset(head, -1, sizeof(head));}void add(int u, int v, int w){ edge[e].v = v; edge[e].w = w; edge[e].next = head[u]; head[u] = e++;}struct NODE{ int u,num;}st,t,tt;int bfs(int src,int end,int k){ for(int i = 1; i <= n; i++) { for(int j=0;j<=k;j++){ vis[i][j] = 0, d[i][j] = INF; } } queue<struct NODE>q; while(!q.empty())q.pop(); st.u=src; st.num=0; q.push(st); vis[src][0] = 1; d[src][0] = 0; while( !q.empty() ) { t = q.front(); q.pop(); vis[ t.u ][t.num]=0; for(int i = head[t.u]; i != -1; i = edge[i].next) { tt.num=t.num+10;tt.u=edge[i].v; if(tt.num>k)tt.num=k; int v = edge[i].v; int w = edge[i].w; if(d[t.u][t.num] + w < d[v][tt.num]) { d[v][tt.num] = d[t.u][t.num] + w; if(!vis[v][tt.num]) { q.push(tt); vis[v][tt.num] = 1; } } } } if(d[end][k]<INF)return d[end][k]; else return -1;}int main(){ int T,S,t,k,a,b,c; scanf("%d",&T); while(T--){ init(); scanf("%d%d",&n,&m); while(m--){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } scanf("%d%d%d",&S,&t,&k); printf("%d\n",bfs(S,t,k)); } return 0;}
hrbust 1669回家Ⅱ
当车上有x个人的时候,每单位的距离将花费x单位的时间。每座城市都住着lz的一个朋友,每次经过一个城市的时候,
就会有一个朋友坐上车和lz一起回到家中。计算出回到家最少要花多少时间。
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <queue>#define MAXN 210#define MAXM 210*210#define INF 0x1f1f1f1fusing namespace std;int n, m;struct EDGE{ int v, next; int w;}edge[MAXM*2];int head[MAXN], e;int vis[MAXN][MAXN];int dist[MAXN][MAXN];int d[MAXN];void init(){ e = 0; memset(head, -1, sizeof(head));}void add(int u, int v, int w){ edge[e].v = v; edge[e].w = w; edge[e].next = head[u]; head[u] = e++;}struct NODE{ int u,num;}st,t,tt;int bfs(int src,int end){ for(int i = 1; i <= n; i++) { for(int j=0;j<=MAXN;j++){ vis[i][j] = 0, dist[i][j] = INF; } d[i]=INF; } queue<struct NODE>q; while(!q.empty())q.pop(); st.u=src; st.num=0; q.push(st); vis[src][0] = 1; dist[src][0] = 0; d[src]=0; while( !q.empty() ) { t = q.front(); q.pop(); vis[ t.u ][t.num]=0; for(int i = head[t.u]; i != -1; i = edge[i].next) { tt.num=t.num+1;tt.u=edge[i].v; int v = edge[i].v; int w = edge[i].w; if(dist[t.u][t.num] + w*tt.num < d[v]) { dist[v][tt.num]=dist[t.u][t.num] + w*tt.num; d[v] = dist[t.u][t.num] + w*tt.num; if(!vis[v][tt.num]) { q.push(tt); vis[v][tt.num] = 1; } } } } if(d[end]<INF)return d[end]; else return -1;}int main(){ int T,a,b,c; while(scanf("%d%d",&n,&m)!=EOF){ init(); while(m--){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } printf("%d\n",bfs(1,n)); } return 0;}
- hrbust 1687买房子 && hrbust 1669回家Ⅱ(二维最短路SPFA)
- hrbust 1669 回家Ⅱ【二维最短路】
- hrbust 1687/哈理工oj 1687 买房子【二维最短路+SPFA】
- hrbust 1450 Farmer John【计算集合+最短路SPFA】
- hrbust 1662 凸多边形【最短路SPFA+建图+思维】好题
- Hrbust-2122 旅行(最短路)
- hrbust 1355 Leyni,罗莉和XianGe【最短路SPFA+思维】好题
- hrbust 1339 Touring【最短路+思维】
- hrbust 1050 Hot Pursuit II【SPFA+次短路】
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- Hrbust
- HRBUST
- 运算符重载
- 打印int值的位表示形式
- Java对象数组的使用
- mvn jetty:run出错,提示没有找到插件.
- uva 10534 - Wavio Sequence
- hrbust 1687买房子 && hrbust 1669回家Ⅱ(二维最短路SPFA)
- linux网桥浅析
- 举例说明android进行初始化组件并设置组件属性的简便方法
- 康宁的玻璃愿景
- (笔记)分配和释放虚拟内存
- PHP开发宝典-PHP基础
- Erlang如何限制节点对集群的访问之net_kernel:allow
- C#连接数据库
- 经理回复我的一封信