|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
传送门:https://pintia.cn/problem-sets/9 ... /994805396953219072
解:
迪杰斯特拉
- #include <cstdio>
- #include <climits>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int maxn = 1050;
- int n, m, k, ds;
- int d[maxn];
- bool vis[maxn];
- int G[maxn][maxn];
- int trans(char *s)
- {
- int id;
- if (*s == 'G')
- {
- sscanf(s + 1, "%d", &id);
- id += n;
- }
- else
- sscanf(s, "%d", &id);
- return id;
- }
- void DJS(int st)
- {
- fill(d, d + maxn, INT_MAX);
- memset(vis, false, sizeof(vis));
- d[st] = 0;
- for (int i = 1; i < n + m; i++)
- {
- int u = -1, min = INT_MAX;
- for (int j = 1; j <= n + m; j++)
- if (!vis[j] && d[j] < min) min = d[u = j];
- if (u == -1) return;
- vis[u] = true;
- for (int v = 1; v <= n + m; v++)
- {
- if (vis[v] || G[u][v] == INT_MAX) continue;
- if (G[u][v] + d[u] < d[v]) d[v] = G[u][v] + d[u];
- }
- }
- }
- int main(void)
- {
- // freopen("input.txt", "r", stdin);
- scanf("%d %d %d %d", &n, &m, &k, &ds);
-
- fill(G[0], G[0] + maxn * maxn, INT_MAX);
-
- while (k--)
- {
- char s1[5], s2[5];
- int a, b, l;
- scanf("%s %s %d", s1, s2, &l);
- a = trans(s1);
- b = trans(s2);
- G[a][b] = G[b][a] = l;
- }
- int max_id = -1, max = INT_MIN;
- double ave[maxn];
- for (int i = n + 1; i <= n + m; i++)
- {
- DJS(i);
- int temp = d[1], total = 0;
- bool flag = false;
- for (int j = 1; j <= n; j++)
- {
- if (d[j] > ds)
- {
- flag = true;
- break;
- }
- total += d[j];
- if (d[j] < temp) temp = d[j];
- }
- if (flag) continue;
- ave[i] = (double)total / (double)n;
- if (temp > max || (temp == max && ave[i] < ave[max_id]))
- {
- max = temp;
- max_id = i;
- }
- }
- if (max_id == -1) puts("No Solution");
- else printf("G%d\n%.1f %.1f\n", max_id - n, (double)max, ave[max_id]);
-
- return 0;
- }
复制代码 |
|