hdu 2066 一个人的旅行 (dij+heap)
2013-03-11 10:43
309 查看
Problem - 2066
入门SP,用dij+heap 0ms通过。
View Code
——written by Lyon
入门SP,用dij+heap 0ms通过。
View Code
#define REP(i, n) for (int i = 0; i < (n); i++) #define REP_1(i, n) for (int i = 1; i <= (n); i++) typedef pair<LL, int> PLI; #define PB push_back #define MPR make_pair #define FI first #define SE second VPII rel ; LL dis ; multiset<PLI> HP; void input(int n, int s, int t) { REP(i, 1002) rel[i].clear(), dis[i] = linf; HP.clear(); int a, b, d; REP(i, n) { scanf("%d%d%d", &a, &b, &d); rel[a].PB(MPR(b, d)); rel[b].PB(MPR(a, d)); } REP(i, s) { scanf("%d", &a); rel[0].PB(MPR(a, 0)); } REP(i, t) { scanf("%d", &a); rel[a].PB(MPR(1001, 0)); } // puts("OK!"); } LL dijHeap(int s, int t) { dis[s] = 0ll; HP.insert(MPR(0ll, s)); while (true) { int id = HP.begin()->SE; // cout << "size " << SZ(HP) << endl; // cout << id << ' ' << HP.begin()->FI << ' ' << dis[id] << endl; if (id == t) return HP.begin()->FI; HP.erase(HP.begin()); REP(i, SZ(rel[id])) { int x = rel[id][i].FI, d = rel[id][i].SE; if (dis[x] > dis[id] + d) { // cout << x << ' ' << dis[x] << endl; if (dis[x] != linf) HP.erase(MPR(dis[x], x)); HP.insert(MPR(dis[x] = dis[id] + d, x)); } } } } int main() { // freopen("in", "r", stdin); int n, s, t; while (~scanf("%d%d%d", &n, &s, &t)) { input(n, s, t); cout << dijHeap(0, 1001) << endl; } return 0; }
——written by Lyon
相关文章推荐
- hdu 2066 一个人的旅行 (DIJ)
- ACM->dijkstra + heap + stl 一个人的旅行 hdu 2066
- HDU 2066 一个人的旅行 (裸的dij)
- hdu 2066 一个人的旅行
- hdu-2066-一个人的旅行(dijkstra)
- HDU 2066 一个人的旅行
- HDU-2066-一个人的旅行
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行.
- HDU 2066 一个人的旅行(地杰斯特拉)
- HDU 2066 一个人的旅行【最短路,多起点多终点,Dijkstra算法+spfa算法】
- 一个人的旅行 hdu 2066
- HDU 2066 一个人的旅行(Dijstra)
- HDU 2066 一个人的旅行 (多源最短路)
- hdu 2066 一个人的旅行
- HDU:2066 一个人的旅行(dijkstra算法求最短路径)
- hdu 2066 一个人的旅行 dijkstra入门题
- HDU 2066 一个人的旅行 (Dijkstra算法)
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行