您的位置:首页 > 运维架构

UVA 10801 Lift Hopping——最短路

2018-03-04 21:48 495 查看
分成n*100个点建图,加上原点汇点跑最短路就可以了,注意同层之间建边时要全部枚举#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef pair<int, int> P;
const int maxn = 1000;
const int INF = 0x3f3f3f3f;
int dis[maxn];
bool vis[maxn];
vector<P> G[maxn];
void init() {
for (int i = 0; i < maxn; i++) G[i].clear();
}
void addedge(int u, int v, int cost) {
G[u].push_back(make_pair(v, cost));
}
int dijkstra(int s, int t) {
memset(dis, INF, sizeof(dis));
memset(vis, false, sizeof(vis));
dis[s] = 0;
priority_queue<P, vector<P>, greater<P> > q;
q.push(make_pair(0, s));
while (!q.empty()) {
int u = q.top().second; q.pop();
if (vis[u]) continue;
vis[u] = true;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i].first, cost = G[u][i].second;
if (dis[v] > dis[u] + cost) {
dis[v] = dis[u] + cost;
q.push(make_pair(dis[v], v));
}
}
}
return dis[t];
}
int n, m, T[maxn];
vector<int> a[maxn];
vector<int> v[maxn];
int x;
char c;
int main() {
while (~scanf("%d %d", &n, &m)) {
init();
for (int i = 0; i < n; i++) scanf("%d", &T[i]);
for (int i = 0; i < maxn; i++) a[i].clear();
for (int i = 0; i < maxn; i++) v[i].clear();
for (int i = 0; i < n; i++) {
while (~scanf("%d%c", &x, &c)) {
a[i].push_back(x);
v[x].push_back(i);
if (c == '\n') break;
}
}
for (int i = 0; i < n; i++) sort(a[i].begin(), a[i].end());
for (int i = 0; i < 100; i++) sort(v[i].begin(), v[i].end());
int s = 998, t = 999;
for (int i = 0; i < n; i++) {
addedge(s, i*100, 0);
addedge(m + i*100, t, 0);
}
for (int i = 0; i < n; i++) {
for (int j = 1; j < a[i].size(); j++) {
addedge(i*100+a[i][j-1], i*100+a[i][j], T[i]*(a[i][j]-a[i][j-1]));
addedge(i*100+a[i][j], i*100+a[i][j-1], T[i]*(a[i][j]-a[i][j-1]));
}
}
for (int i = 0; i < 100; i++) {
for (int j = 0; j < v[i].size(); j++) {
for (int k = 0; k < j; k++) {
addedge(i+v[i][j]*100, i+v[i][k]*100, 60);
addedge(i+v[i][k]*100, i+v[i][j]*100, 60);
}
}
}
int ans = dijkstra(s, t);
if (ans >= INF) printf("IMPOSSIBLE\n");
else printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: