POJ 1502 MPI Maelstrom
2018-01-16 13:45
260 查看
题目链接:https://vjudge.net/problem/POJ-1502
题很简单,就是阅读起来有点麻烦,我解释一下样例就可以了,普通的最短路,很容易。
Sample Input
5 表示有5个点 (路径都是双向的)
50 1和2相关联,路径长度为50
30 5 3和1 长度为30 3和2 长度为5
100 20 50 4和1 : 100 4和2 : 20 4和3 : 50
10 x x 10 5和1 : 10 5和2 :不存在路径 5和3 不存在路径 5 和 4 : 10
根据上面的输入可以看出来,其实就是位置代表节点的联通,数值代表权值。
Sample Output
35
根据上面的输入就可以知道每个节点到其他节点是否关联,以及权值是多少,然后跑最短路,最后求出,1节点到其他节点的最短路。比如:1到2最短路是35;1到3是30;1到4是20;1到5是10;所以输出35(即最短路中的最大值)。
思路:因为节点个数是100,并且没有负权值,所以都可以写了,我用了三种写法,都非常简单。
Floyd:
Bellman-Ford:
题很简单,就是阅读起来有点麻烦,我解释一下样例就可以了,普通的最短路,很容易。
Sample Input
5 表示有5个点 (路径都是双向的)
50 1和2相关联,路径长度为50
30 5 3和1 长度为30 3和2 长度为5
100 20 50 4和1 : 100 4和2 : 20 4和3 : 50
10 x x 10 5和1 : 10 5和2 :不存在路径 5和3 不存在路径 5 和 4 : 10
根据上面的输入可以看出来,其实就是位置代表节点的联通,数值代表权值。
Sample Output
35
根据上面的输入就可以知道每个节点到其他节点是否关联,以及权值是多少,然后跑最短路,最后求出,1节点到其他节点的最短路。比如:1到2最短路是35;1到3是30;1到4是20;1到5是10;所以输出35(即最短路中的最大值)。
思路:因为节点个数是100,并且没有负权值,所以都可以写了,我用了三种写法,都非常简单。
Floyd:
#include <stdio.h> #include <string.h> #define inf 0x3f3f3f3f int e[105][105]; int atoi(char s[]) { int m = strlen(s); int sum = 0; for(int i = 0; i < m; i++) { sum = sum*10 + s[i]-'0'; } return sum; } void init(int n) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == j) e[i][j] = 0; else e[i][j] = inf; } } } void Floyd(int n) { for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(e[i][j] > (e[i][k] + e[k][j])) { e[i][j] = e[i][k] + e[k][j]; } } } } return ; } int main() { int n; char num[15]; scanf("%d", &n); init(n); for(int i = 2; i<= n; i++) { for(int j = 1; j < i; j++) { scanf("%s", num); if(num[0] == 'x') { continue; } else { e[i][j] = e[j][i] = atoi(num); } } } Floyd(n); int mx = 0; for(int i = 2; i <= n; i++) { if(mx < e[1][i]) mx = e[1][i]; } printf("%d\n",mx); return 0; }Dijkstra:
#include <stdio.h> #include <string.h> #define inf 0x3f3f3f3f int dis[105]; int book[105]; int e[105][105]; void init(int n) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == j) e[i][j] = 0; else e[i][j] = inf; } } } int atoi(char s[]) { int m = strlen(s); int sum = 0; for(int i = 0; i < m; i++) { sum = sum*10 + s[i]-'0'; } return sum; } void Dijkstra(int n) { for(int i = 1; i <= n; i++) dis[i] = e[1][i]; memset(book, 0, sizeof(book)); book[1] = 1; int mn, p; for(int i = 1; i <= n; i++) { mn = inf; for(int j = 1; j <= n; j++) { if(!book[j] && mn > dis[j]) { mn = dis[j]; p = j; } } book[p] = 1; for(int k = 1; k <= n; k++) { if(book[k]) continue; if(dis[k] > (dis[p] + e[p][k])) { dis[k] = dis[p] + e[p][k]; } } } return ; } int main() { int n; char num[15]; scanf("%d",&n); init(n); for(int i = 2; i <= n; i++) { for(int j = 1; j 4000 < i; j++) { scanf("%s", num); if(num[0] == 'x') { continue; } else { e[i][j] = e[j][i] = atoi(num); } } } Dijkstra(n); int mx = 0; for(int i = 2; i <= n; i++) { if(mx < dis[i]) mx = dis[i]; } printf("%d\n", mx); return 0; }
Bellman-Ford:
#include <stdio.h> #include <string.h> #define inf 0x3f3f3f3f int dis[105]; struct node{ int u, v; int Edge; void Node(int u1, int v1, int w) { u = u1; v = v1; Edge = w; } }e[10005]; int atoi(char s[]) { int m = strlen(s); int sum = 0; for(int i = 0; i < m; i++) { sum = sum*10 + s[i]-'0'; } return sum; } void Bellman(int n, int t) { memset(dis, inf, sizeof(dis)); dis[1] = 0; for(int i = 1; i <= n; i++) { bool flag = false; for(int j = 1; j < t; j++) { int u = e[j].u; int v = e[j].v; int w = e[j].Edge; if(dis[v] > dis[u] + w) { dis[v] = dis[u]+w; flag = true; } } if(!flag) break; } } int main() { int n; char num[15]; scanf("%d", &n); int t = 0; for(int i = 2; i <= n; i++) { for(int j = 1; j < i; j++) { scanf("%s", num); if(num[0] == 'x') { continue; } else { e[t++].Node(i, j, atoi(num)); e[t++].Node(j, i, atoi(num)); } } } Bellman(n, t); int mx = 0; for(int i = 2; i <= n; i++) { if(mx < dis[i]) { mx = dis[i]; } } printf("%d\n", mx); return 0; }
相关文章推荐
- poj 1502 MPI Maelstrom--dijkstra--atoi
- POJ ~ 1502 ~ MPI Maelstrom (Dijkstra + 字符处理)
- POJ 1502 - MPI Maelstrom(单源最短路)
- poj 1502 MPI Maelstrom
- poj 1502 MPI Maelstrom (dij)
- POJ 1502 MPI Maelstrom(单源最短路|Dijkstra实现)
- 最短路径___MPI Maelstrom(Poj 1502)
- Poj 1502 MPI Maelstrom (dijkstra)
- POJ 1502 MPI Maelstrom [最短路 Dijkstra]
- POJ 1502 MPI Maelstrom(单源最短路|Floyd实现)
- POJ_1502(Floyd算法)MPI Maelstrom
- POJ 1502 MPI Maelstrom 最短路dijkstra
- POJ 1502 MPI Maelstrom
- Dijkstra-POJ-1502-MPI Maelstrom
- POJ 1502 MPI Maelstrom
- POJ 1502 MPI Maelstrom——dijkstra
- POJ - 1502 MPI Maelstrom —— dijkstra
- POJ 1502 MPI Maelstrom (Dijkstra算法+输入处理)
- POJ 1502 MPI Maelstrom Dijkstra
- poj 1502 MPI Maelstrom(最短路)