hdu 2066 一个人的旅行
2015-07-16 22:35
363 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
最短路。。
最短路。。
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<map> using std::min; using std::cin; using std::cout; using std::endl; using std::find; using std::sort; using std::pair; using std::vector; using std::multimap; using std::priority_queue; #define pb(e) push_back(e) #define sz(c) (int)(c).size() #define mp(a, b) make_pair(a, b) #define all(c) (c).begin(), (c).end() #define iter(c) decltype((c).begin()) #define cls(arr,val) memset(arr,val,sizeof(arr)) #define cpresent(c, e) (find(all(c), (e)) != (c).end()) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i) const int N = 10010; typedef unsigned long long ull; struct P { int w, v; P(int i = 0, int j = 0) :w(i), v(j) {} inline bool operator<(const P &a) const { return w > a.w; } }; struct Node { int to, w, next; }; struct Dijkstra { Node G ; int tot, head , dist ; inline void init() { tot = 0, cls(head, -1); } inline void add_edge(int u, int v, int w) { G[tot] = { v, w, head[u] }; head[u] = tot++; } inline void built(int n) { int u, v, w; rep(i, n) { scanf("%d %d %d", &u, &v, &w); add_edge(u, v, w), add_edge(v, u, w); } } inline void dijkstra(vector<int> &st) { cls(dist, 0x3f); priority_queue<P> q; rep(i, sz(st)) { q.push(P(0, st[i])); dist[st[i]] = 0; } while (!q.empty()) { P t = q.top(); q.pop(); int u = t.v; if (dist[u] < t.w) continue; for (int i = head[u]; ~i; i = G[i].next) { int &w = dist[G[i].to]; if (w > dist[u] + G[i].w) { w = dist[u] + G[i].w; q.push(P(w, G[i].to)); } } } } inline void work(int s, int d) { int v, ans = 0x3f3f3f3f; vector<int> A, B; while (s--) { scanf("%d", &v); A.push_back(v); } while (d--) { scanf("%d", &v); B.push_back(v); } dijkstra(A); rep(i, sz(B)) ans = min(ans, dist[B[i]]); printf("%d\n", ans); } }go; int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w+", stdout); #endif int n, s, d; while (~scanf("%d %d %d", &n, &s, &d)) { go.init(); go.built(n); go.work(s, d); } return 0; }
相关文章推荐
- DOM对象
- 在linux上静默安装oracle数据库
- 【沙龙干货】如何在实际工程中使用Swift开发?
- Server SQL 发布复制事物时的错误提示:读取代理器未运行 进程无法在“WIN-XXX”上执行“sp_replcmds”
- 延迟加载div
- HOW TO SET UP ADB (ANDROID DEBUG BRIDGE) IN MAC OSX
- HTML编程之实现文字水平居中
- PHP中类的继承关系
- noi2015模板-后缀自动机
- 多个mapreduce工作相互依赖处理方法完整实例
- 关于iOS逆向工程的工具(二)
- C#子窗体调用主窗体中事件
- 完成基于哈夫曼树(最优二叉树)的压缩及解压小程序的收获
- Odi银行储蓄系统
- VC运行库依赖导致的InnoSetup安装程序调用DLL报错:无法导入DLL
- noi2015模板-最小表示
- 解决bash: mysql: command not found 的方法
- 文档对象模型DOM
- scrollview 滚动布局
- 使tableview每个section显示不同行数的方法