ACM/ICPC 之 Floyd练习六道(ZOJ2027-POJ2253-POJ2472-POJ1125-POJ1603-POJ2607)
生活随笔
收集整理的這篇文章主要介紹了
ACM/ICPC 之 Floyd练习六道(ZOJ2027-POJ2253-POJ2472-POJ1125-POJ1603-POJ2607)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以Floyd解法為主的練習題六道
?
ZOJ2027-Travelling Fee
?
//可免去一條線路中直接連接兩城市的最大旅行費用,求最小總旅行費用 //Time:0Ms Memory:604K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std;#define MAX 205 #define MAXS 12 #define INF 0x3f3f3f3fint n,m; int dis[MAX][MAX]; int high[MAX][MAX]; //該線路中直接連接兩城市的最大旅行費用struct City {char name[MAXS]; }c[MAX];int find(char s[MAXS]) {for (int i = 0; i < n; i++)if (!strcmp(s, c[i].name)) return i;return -1; }void floyd() {for (int k = 0; k < n; k++)for (int i = 0; i < n; i++)for (int j = 0; j < n; j++){if (high[i][k] == -1 || high[k][j] == -1) continue;int maxCost = max(high[i][k], high[k][j]);if (dis[i][j] - high[i][j] > dis[i][k] + dis[k][j] - maxCost){dis[i][j] = dis[i][k] + dis[k][j];high[i][j] = maxCost;}} }int main() {while (scanf("%s%s", c[0].name, c[1].name) != EOF){memset(dis, INF, sizeof(dis));memset(high, -1, sizeof(high));int d; n = 2;char s[MAXS],t[MAXS];scanf("%d", &m);while (m--){scanf("%s%s%d", s, t, &d);int ns = find(s), nt = find(t);if (ns == -1) {memcpy(c[n].name, s, sizeof(s));ns = n++;}if (nt == -1) {memcpy(c[n].name, t, sizeof(t));nt = n++;}high[ns][nt] = dis[ns][nt] = d;}floyd();printf("%d\n", dis[0][1] - high[0][1]);}return 0; }?
?
?
POJ2253-Frogger
?
?
//求0->1間的最小的最大單次青蛙跳躍距離 //Time:94Ms Memory:508K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std;#define MAX 205 #define POW2(x) ((x)*(x)) #define DIS(a,b) (sqrt(POW2(p[a].x - p[b].x) + POW2(p[a].y - p[b].y)))struct Point {double x, y; }p[MAX];int n; double dis[MAX][MAX]; //兩點間最小的最大一次跳躍距離void floyd() {for (int k = 0; k < n; k++)for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)dis[i][j] = min(dis[i][j], max(dis[i][k], dis[k][j])); }int main() {int cas = 1;while (scanf("%d", &n), n){for (int i = 0; i < n; i++){scanf("%lf%lf", &p[i].x, &p[i].y);for (int j = 0; j < i; j++)dis[i][j] = dis[j][i] = DIS(i, j);dis[i][i] = 0;}floyd();printf("Scenario #%d\n", cas++);printf("Frog Distance = %.3f\n\n", dis[0][1]);}return 0; }?
?
?
POJ2472-106 miles to Chicago
?
?
//求1到n的最大存活率 //Time:157Ms Memory:264K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std;#define MAX 105 int n, m; double dis[MAX][MAX];void floyd() {for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)dis[i][j] = max(dis[i][j], dis[i][k] * dis[k][j]); }int main() {while (scanf("%d%d", &n, &m), n){memset(dis, 0, sizeof(dis));int x, y, d;while (m--) {scanf("%d%d%d", &x, &y, &d);dis[x][y] = dis[y][x] = d / 100.0;}floyd();printf("%.6lf percent\n", 100*dis[1][n]);}return 0; }?
?
?
POJ1125-Stockbroker Grapevine
?
?
//從某點擴散到所有點的最短時間-求出該點及時間 //Time:0Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std;#define MAX 105 #define INF 0x3f3f3f3fint n, m; int dis[MAX][MAX]; int time[MAX];void floyd() {for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); }int main() {while (scanf("%d", &n), n){memset(dis, INF, sizeof(dis));memset(time, 0, sizeof(time));int y, d;for (int x = 1; x <= n; x++){scanf("%d", &m);while (m--) {scanf("%d%d", &y, &d);dis[x][y] = d;dis[x][x] = 0;}}floyd();int Min = INF;int k = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)time[i] = max(time[i], dis[i][j]);for (int i = 1; i <= n; i++){if (Min > time[i]){Min = time[i];k = i;}}if (Min == INF) printf("disjoint\n");else printf("%d %d\n", k, Min);}return 0; }?
?
?
POJ1603-Risk
?
?
//求依靠攻打接壤國需要最少攻打多少國家才能從起始國家打到終止國家 //Time:0Ms Memory:168K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std;#define MAX 21 #define INF 0x3f3f3f3fint n, m; int dis[MAX][MAX];void floyd() {for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); }int main() {int cas = 0;n = 20;while (scanf("%d", &m) != EOF){memset(dis, INF, sizeof(dis));int x, y;for (x = 1; x <= 19; x++){while (m--) {scanf("%d", &y);dis[x][y] = dis[y][x] = 1;}scanf("%d", &m);}floyd();if (cas) printf("\n");printf("Test Set #%d\n", ++cas);while (m--) {scanf("%d%d", &x, &y);printf("%d to %d: %d\n", x, y, dis[x][y]);}}return 0; }?
?
?
POJ2607-Fire Station
這道題稍微比上面的五道題復雜一些
?
//Floyd解法 //已知消防站,現建新消防站,使得所有路口到消防站的最大值減至最小,將最小序列路口輸出 //Time:1797Ms Memory:1164K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std;#define MAX 505 #define INF 0x3f3f3f3fint f, n, m; int dis[MAX][MAX]; bool v[MAX]; int md[MAX]; //各路口到消防站最短距離void floyd() {for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); }int main() {memset(dis, INF, sizeof(dis));memset(md, INF, sizeof(md));scanf("%d%d", &f, &n);int x, y, d;for (int i = 0; i < f;i++){scanf("%d", &x);v[x] = true;dis[x][x] = 0;}while (scanf("%d%d%d", &x, &y, &d) != EOF)dis[x][y] = dis[y][x] = d;floyd();for (int i = 1; i <= n; i++){dis[i][i] = 0;if (!v[i]) continue;for (int j = 1; j <= n; j++)md[j] = min(md[j], dis[i][j]);}int Max = INF, k = 1; //默認為1,否則A不掉(我懷疑數據有問題或題目描述不清)for (int i = 1; i <= n; i++){if (v[i]) continue;int tmp = 0;for (int j = 1; j <= n; j++)tmp = max(tmp, min(md[j], dis[i][j]));if (Max > tmp){Max = tmp;k = i;}}printf("%d\n", k);return 0; }?
轉載于:https://www.cnblogs.com/Inkblots/p/5499802.html
總結
以上是生活随笔為你收集整理的ACM/ICPC 之 Floyd练习六道(ZOJ2027-POJ2253-POJ2472-POJ1125-POJ1603-POJ2607)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾跃英语计算机学院微信公众号,英语四级报
- 下一篇: python测试app性能_python