csu1808 地铁
来源:互联网 发布:java 测试 编辑:程序博客网 时间:2024/04/25 20:30
终于把这道题补了,,拖了一个学期了,一直懒得去补。。
题目连接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808
比普通的最短路,就是多了个换乘的花费,很自然的用 d[n][pre]代表从pre这条路到n这个点的最小时间花费,但第二维需要开多大那?d[1e5][1e5]?显然会爆,,因为有很多路是用不到的,所以又会很自然的想到,,可以只用vector保存有用的pre。。然后就是裸的dijikstra了
#include<iostream>#include<stdio.h>#include<queue>#include<algorithm>#include<string.h>#define MX 111111#define INF 0x3f3f3f3f#define mem(x,y) memset(x,y,sizeof(x))#define FIN freopen("input.txt","r",stdin)using namespace std;int n,m,s,t;int head[MX],rear;int num[MX];vector<int> d[MX];struct Edge{ int to,nxt; int c,dist; int num;} edge[2*MX];struct Nod{ int id,dist,c,num; bool operator <(const Nod &a)const { return dist>a.dist; } Nod(int id,int dist,int c,int num):id(id),dist(dist),c(c),num(num) {}};void edge_init(){ mem(head,-1); rear=0;}void edge_add(int a,int b,int c,int dist,int x){ edge[rear].dist=dist; edge[rear].nxt=head[a]; edge[rear].to=b; edge[rear].c=c; edge[rear].num=x; head[a]=rear++;}int dijikstra(){ priority_queue<Nod> Q; for(int i =0; i<d[1].size(); i++) d[1][i]=0; for(int i=head[1]; ~i; i=edge[i].nxt) { Q.push(Nod(edge[i].to,edge[i].dist,edge[i].c,edge[i].num)); d[edge[i].to][edge[i].num]=edge[i].dist; } while(!Q.empty()) { Nod u=Q.top(); Q.pop(); if(u.id==n) return u.dist; if(d[u.id][u.num]<u.dist) continue; for(int i=head[u.id]; ~i; i=edge[i].nxt) { int v=edge[i].to; if(d[v][edge[i].num]<=u.dist+edge[i].dist+abs(u.c-edge[i].c)) continue; d[v][edge[i].num]=u.dist+edge[i].dist+abs(u.c-edge[i].c); Q.push(Nod(v,d[v][edge[i].num],edge[i].c,edge[i].num)); } } return -1;}int main(){ FIN; int cas=0; while(cin>>n>>m) { for(int i=1; i<=n; i++) d[i].clear(); edge_init(); mem(num,0); for(int i=1; i<=m; i++) { int a,b,c,dist; scanf("%d%d%d%d",&a,&b,&c,&dist); edge_add(a,b,c,dist,num[b]++); d[b].push_back(INF); edge_add(b,a,c,dist,num[a]++); d[a].push_back(INF); } printf("%d\n",dijikstra()); } return 0;}
0 0
- CSU1808 地铁
- csu1808 地铁
- 最短路 csu1808 地铁
- csu1808 地铁(最短路)
- CSU1808 地铁 —— dijkstra变形
- 2016湖南省省赛F-地铁(CSU1808)
- 地铁
- csu1808(优先级队列+Dijkstra)
- csu1808 bfs +优先队列
- 深圳地铁
- 地铁随想
- 混乱地铁
- 地铁生活
- 地铁随想
- 地铁 遇见
- 地铁摸腿男被抓
- 地铁换乘
- 地铁换乘
- C语言程序设计---8:指针
- JDK并发包---(8)ReadWriteLock读写锁:替换ReentrantLock,提高性能
- Unity3D实现Tab切换,页面切换功能
- 一不小心修改了/etc/profile 文件导致命令不可用怎么办,不要怕~
- Rule-Caching Algorithms for Software-Defined Networks(论文笔记)
- csu1808 地铁
- Android Studio2.2.2以后版本用CMake方法配置OpenCV3.1.0完善版
- java面试题及答案(基础题122道,代码题19道)
- spring bean的scope属性
- Linux Source命令及脚本的执行方式解析
- unity,跟着大佬做第一个游戏(二,模型导入和游戏基本代码编写)
- php 接收二进制流转换成图片
- 网络协议---MPL(1):draft-ietf-roll-trickle-mcast-12文档翻译
- 设计模式:工厂方法模式