uva 10740 Not the Best (最短路 A*算法)
2015-09-05 11:00
363 查看
uva 10740 Not the Best
题目大意:求第K短路。
解题思路:A*算法。这题数据量比较小,也可以暴力。
A*算法[code]#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> #include <queue> using namespace std; typedef long long ll; const int N = 105; const int INF = 0x3f3f3f3f; int n, m; int s, t, K; int h ; bool vis ; struct Node { int to, dis; }; int gra , gra2 ; bool operator < (const Node& a, const Node& b) { return (a.dis + h[a.to] > b.dis + h[b.to]); } void init() { memset(vis, 0, sizeof(vis)); for(int i = 0; i <= n + 1; i++) h[i] = INF; h[t] = 0; for(int i = 1; i <= n; i++) { int x, m = INF; for(int j = 1; j <= n; j++) { if(!vis[j] && m > h[j]) { m = h[j]; x = j; } } vis[x] = true; for (int j = 1; j <= n; j++) { if (!vis[j] && gra2[x][j] + h[x] < h[j]) { h[j] = gra2[x][j] + h[x]; } } } } int Astar() { priority_queue<Node> Q; init(); if (s == t) K++; if (h[s] == INF) return -1; int ans = -1, count = 0; Node p; p.to = s; p.dis = 0; Q.push(p); while(!Q.empty()) { p = Q.top(); Q.pop(); if (p.to == t) count++; if (count == K) { ans = p.dis; break; } for (int i = 1; i <= n; i++) { if (gra[p.to][i] != INF) { Q.push((Node){i, p.dis + gra[p.to][i]}); } } } return ans; } void input() { for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { gra[i][j] = INF; gra2[i][j] = INF; } } scanf("%d %d %d", &s, &t, &K); int u, v, d; for (int i = 0; i < m; i++) { scanf("%d %d %d", &u, &v, &d); gra[u][v] = min(gra[u][v], d); gra2[v][u] = min(gra2[v][u], d); } } int main() { while (scanf("%d %d", &n, &m) == 2) { if (n == 0 && m == 0) break; input(); printf("%d\n", Astar()); } return 0; }
暴力
[code]#include<cstdio> #include<algorithm> #include<vector> #include<cstring> #include<stack> #include<iostream> #include<queue> using namespace std; const int N = 105; int n, m; int s, t, k; struct Edge{ int to, dis; }; vector<Edge> G ; int vis ; int BFS(){ int ans = -1; priority_queue<pair<int, int> > q; memset(vis, 0, sizeof vis); q.push(make_pair(0, s)); while(!q.empty()){ pair<int, int> p = q.top(); q.pop(); int dist = -p.first; int pos = p.second; if(vis[pos] > k) continue; vis[pos]++; if(pos == t && vis[pos] == k){ ans = dist; break; } for(int i = 0;i < G[pos].size();i++){ int to = G[pos][i].to; int dis = G[pos][i].dis; q.push(make_pair(-(dis + dist), to)); } } return ans; } int main(){ while(scanf("%d%d", &n, &m)){ if(n == 0 && m == 0) break; scanf("%d%d%d", &s, &t, &k); for(int i = 0; i <= n; i++) G[i].clear(); for (int i = 0; i < m; i++) { int u, v, d; scanf("%d%d%d", &u, &v, &d); G[u].push_back((Edge){v, d}); } printf("%d\n", BFS()); } return 0; }
相关文章推荐
- 标准的ActionRecord效验错误信息
- JAVA注解
- POJ2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- 若不想使用编译器默认生成的函数,就该拒绝(Effective C++_6)
- 用Rails-2.1.6搭建一个web项目的步骤(修正)
- 书摘-优秀的软件测试员应具备的素质
- leetcode_Maximum Subarray _medium(最大子数组的和)
- 犀牛——第8章函数 8.7函数属性、方法和构造函数
- Android Api Demos登顶之路(五十七)Service Remote Service Binding options
- Java设计模式-1-概述
- TVS二极管和稳压二极管的区别
- Linux 进程间通信(一)(经典IPC:消息队列、信号量、共享存储)
- 2003 Can't connect to MySQL server on 'localhost' (10061)
- Android四种存储方式 sharedpreference,file,SQlite,contentprovider实现增删改查
- 参数在编译器决定
- n级台阶问题
- POJ 2255 二叉树由前序遍历中序遍历得到后序遍历
- Android 实现适配器中的子控件与Activity通信
- Tomcat基本知识
- Python爬虫框架--pyspider初体验