您的位置:首页 > 其它

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:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: