SGU 4444 Travel(最短路+bfs)
来源:互联网 发布:qq超市数据清零 编辑:程序博客网 时间:2024/05/16 04:44
题意:给定一个完全图,其中有两种边,长度为a(不超过5e5)或长度为b(剩下的),求有1~n的最短路径(数据范围1e5)。
思路:这题的答案显然分为两种情况,第一种1到n的边长为b,这时我们要求长为a的这些边从1到n的最短路,因为边长都相同,一次bfs即可。
第二种情况是1到n的边长为a,此时我们要求长为b的这些边从1到n的最短路,因为边数太多,直接bfs肯定t,
考虑用一个set维护当前剩余的未到达点,每次将set中的长为a的边到达的点删去,然后bfs即可,这样做保证了每个点只被访问一次,时间复杂度为O(n*logn)。
#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<ctime>#define eps 1e-6#define LL long long#define pii pair<int, int>//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const int MAXN = 100100;const int INF = 0x3f3f3f3f;int n, m, a, b;int dist[MAXN];bool vis[MAXN];struct Edge { int to,next;} edge[MAXN*10];int head[MAXN], tot;void init() { tot = 0; memset(head,-1,sizeof(head));}void addedge(int u, int v) { edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++;}LL bfs1() {queue<int> q;memset(vis, 0, sizeof(vis));q.push(1);vis[1] = 1;while(!q.empty() && !vis[n]) {int t = q.front(); q.pop();for(int i = head[t]; i != -1; i = edge[i].next) {int u = edge[i].to;if(vis[u]) continue;dist[u] = dist[t] + 1;vis[u] = 1;q.push(u);}}if(!vis[n]) return INF;else return (LL)dist[n]*a;}LL bfs2() {set<int> last;for(int i = 2; i <= n; i++) last.insert(i);queue<int> q;memset(vis, 0, sizeof(vis));q.push(1);vis[1] = 1;while(!q.empty() && !vis[n]) {int t = q.front(); q.pop();set<int> tmp;for(int i = head[t]; i != -1; i = edge[i].next) {int u = edge[i].to;if(vis[u]) continue;last.erase(u);tmp.insert(u);}for(set<int>::iterator it = last.begin(); it != last.end(); it++) {int u = *it;dist[u] = dist[t] + 1;vis[u] = 1;q.push(u);}last = tmp;}if(!vis[n]) return INF;else return (LL)dist[n]*b;}int main() { //freopen("input.txt", "r", stdin);while(scanf("%d%d%d%d", &n, &m, &a, &b) == 4) {init();bool tag = 0;for(int i = 1, u, v; i <= m; i++) {scanf("%d%d", &u, &v);addedge(u, v);addedge(v, u);if(u==1&&v==n || u==n&&v==1) tag = 1;}LL ans;if(tag) ans = min((LL)a, bfs2());else ans = min((LL)b, bfs1());cout << ans << endl;} return 0;}
0 0
- SGU 4444 Travel(最短路+bfs)
- hdu 2433 Travel (bfs+最短路生成树+剪枝)
- [HDU2433] Travel BFS+最短路生成树
- 【最短路+bfs+剪枝】杭电 hdu 2433 Travel
- SCU 4444 Travel (完全图 最短路 set )
- SCU-4444 Travel(变形最短路)
- HDU - 2433 Travel (最短路树)
- HDU-2433 Travel(最短路[Dijkstra])
- Estrella's Travel (最短路spfa)
- SGU 103. Traffic Lights(最短路)
- BFS-最短路(迷宫)
- hdu 2433 Travel 最短路
- scu 4444 Travel 补图的最短路
- SCU 4444 Travel 完全图的最短路求法
- PAT 1030. Travel Plan (30) (最短路)
- HDU 4885 —— TIANKENG’s travel(最短路)
- LightOJ 1221 Travel Company(贝尔曼最短路判负环)
- UVA 1048 - Low Cost Air Travel(最短路)
- 鞍点
- UML类图几种关系的总结
- Hbase笔记五:Hbase和Hive
- split命令使用详解
- 打工图个什么
- SGU 4444 Travel(最短路+bfs)
- Hbase笔记六:Hbase和传统关系型数据库
- 菜鸟学数据库(一)——三范式
- Codeforces Round #323 (Div. 2) 解题报告
- hdu2126(三维背包)
- leetcode 283.Move Zeroes-移除0
- Java 使用Axis 开发WebService 客户端
- 进程间通信机制
- FZU 2204 7 (环形dp)