2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) Solution
A. Drawing Borders
Unsolved.
B. Buildings
Unsolved.
C. Joyride
Upsolved.
题意:
在游乐园中,有n个游玩设施,有些设施之间有道路,给出每个设施需要花费的时间和价格,以及经过每条道路的时间,求从设施1出发恰好回到设施1恰好花费时间x的最小花费。
思路:
$dist[i][j] 表示 第i个时刻 到第j个点的最小花费 从<t[1], 1> -> <x, 1>$
跑最短路即可
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 3010 5 #define ll long long 6 #define INF 0x3f3f3f3f3f3f3f3f 7 int X, n, m, T, t[N], p[N]; 8 vector <int> G[N]; 9 10 struct node 11 { 12 int x, to; ll w; 13 node () {} 14 node (int x, int to, ll w) : x(x), to(to), w(w) {} 15 bool operator < (const node &r) const { return w > r.w; } 16 }; 17 18 bool used[N][N]; 19 ll dist[N][N]; 20 void Dijkstra() 21 { 22 for (int i = 1; i <= X; ++i) for (int j = 1; j <= n; ++j) dist[i][j] = INF, used[i][j] = 0; 23 priority_queue <node> q; q.emplace(t[1], 1, 0); dist[t[1]][1] = p[1]; 24 while (!q.empty()) 25 { 26 int x = q.top().x, u = q.top().to; q.pop(); 27 if (x > X) continue; 28 if (used[x][u]) continue; 29 used[x][u] = 1; 30 if (!used[x + t[u]][u] && dist[x + t[u]][u] > dist[x][u] + p[u]) 31 { 32 dist[x + t[u]][u] = dist[x][u] + p[u]; 33 q.emplace(x + t[u], u, dist[x + t[u]][u]); 34 } 35 for (auto v : G[u]) if (!used[x + t[v] + T][v] && dist[x + t[v] + T][v] > dist[x][u] + p[v]) 36 { 37 dist[x + t[v] + T][v] = dist[x][u] + p[v]; 38 q.emplace(x + t[v] + T, v, dist[x + t[v] + T][v]); 39 } 40 } 41 } 42 43 int main() 44 { 45 while (scanf("%d", &X) != EOF) 46 { 47 scanf("%d%d%d", &n, &m, &T); 48 for (int i = 1, u, v; i <= m; ++i) 49 { 50 scanf("%d%d", &u, &v); 51 G[u].push_back(v); 52 G[v].push_back(u); 53 } 54 for (int i = 1; i <= n; ++i) scanf("%d%d", t + i, p + i); 55 Dijkstra(); 56 if (dist[X][1] == INF) puts("It is a trap."); 57 else printf("%lld ", dist[X][1]); 58 } 59 return 0; 60 }
D. Pants On Fire
Solved.
题意:
给出一些关系,再给出一些关系的询问,对于询问给出三种结果。
思路:
Floyd求闭包,但是我还是想知道为什么拓扑排序不行,难道是题意读错,它不一定是个DAG?
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define N 410 5 int n, m; 6 map <string, int> mp; int cnt; 7 char a[N], b[N]; 8 int G[N][N]; 9 10 int getid(char *s) 11 { 12 if (mp.find(s) == mp.end()) mp[s] = ++cnt; 13 return mp[s]; 14 } 15 16 void Floyd() 17 { 18 for (int k = 1; k <= cnt; ++k) 19 { 20 for (int i = 1; i <= cnt; ++i) 21 { 22 for (int j = 1; j <= cnt; ++j) 23 { 24 if (G[i][k] & G[k][j]) 25 G[i][j] = 1; 26 } 27 } 28 } 29 } 30 31 void init() 32 { 33 memset(G, 0, sizeof G); 34 mp.clear(); cnt = 0; 35 } 36 37 int main() 38 { 39 while (scanf("%d%d", &n, &m) != EOF) 40 { 41 init(); 42 for (int i = 1, u, v; i <= n; ++i) 43 { 44 scanf("%s are worse than %s", a, b); 45 u = getid(a), v = getid(b); 46 G[u][v] = 1; 47 } 48 Floyd(); 49 //for (auto it : mp) cout << it.first << " " << rt[it.second] << " " << deep[it.second] << endl; 50 for (int i = 1, u, v; i <= m; ++i) 51 { 52 scanf("%s are worse than %s", a, b); 53 u = getid(a), v = getid(b); 54 if (G[u][v] == 1) puts("Fact"); 55 else if (G[v][u] == 1) puts("Alternative Fact"); 56 else puts("Pants on Fire"); 57 } 58 } 59 return 0; 60 }