POJ

来源:互联网 发布:2017年快餐行业数据 编辑:程序博客网 时间:2024/06/08 02:22

题目大意:给出一个 n×n 邻接矩阵的下三角,x 表示不可达,A(i, j) = A(j, i),i == j 时为 0,求 1 到其余点最小花费时间中的最大值
解题思路:裸最短路
dijkstra:
Time(ms):16
Mem(MB):0.2

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<cmath>#include<string.h>#include<string>#include<queue>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN = 100+5;using namespace std;int map[MAXN][MAXN];int dis[MAXN];bool vis[MAXN];int n;void dijkstra() {    for (int i = 1; i <= n; i++)        dis[i] = map[1][i];    for (int i = 1; i <= n; i++) {        int v, minn = INF;        for (int j = 1; j <= n; j++)            if (!vis[j] && dis[j] < minn) {                minn = dis[j];                v = j;            }        vis[v] = true;        for (int j = 1; j <= n; j++)            if (!vis[j] && dis[v] + map[v][j] < dis[j])                dis[j] = dis[v] + map[v][j];    }}int main() {    while (scanf("%d", &n) != EOF) {        for (int i = 1; i <=n; i++)            for (int j = 1; j <= n; j++)                if (i == j) map[i][j] = 0;                else map[i][j] = INF;        char s[10];        for (int i = 2; i <= n; i++)            for (int j = 1; j < i; j++) {                scanf("%s", s);                if (s[0] != 'x')                    map[i][j] = map[j][i] = atoi(s);            }        dijkstra();        int ans = 0;        for (int i = 1; i <= n; i++)            if (dis[i] > ans)                ans = dis[i];        printf("%d\n", ans);    }    return 0;}

spfa:
Time(ms):16
Mem(MB):0.3

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<cmath>#include<string.h>#include<string>#include<queue>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN = 100+5;using namespace std;int map[MAXN][MAXN];int dis[MAXN];bool vis[MAXN];int n;void spfa() {    int bg = 1;    queue<int> q;    memset(vis, 0, sizeof(vis));    for (int i = 1; i <= n; i++)        dis[i] = INF;    q.push(bg);    dis[1] = 0;    vis[1] = 1;    while (!q.empty()) {        int v = q.front();        q.pop();        vis[v] = 0;        for (int i = 1; i <= n; i++) {            if (dis[i] > dis[v] + map[v][i]) {                dis[i] = dis[v] + map[v][i];                if (!vis[i]) {                    q.push(i);                    vis[i] = 1;                }            }        }    }}int main() {    while (scanf("%d", &n) != EOF) {        for (int i = 1; i <=n; i++)            for (int j = 1; j <= n; j++)                if (i == j) map[i][j] = 0;                else map[i][j] = INF;        char s[10];        for (int i = 2; i <= n; i++)            for (int j = 1; j < i; j++) {                scanf("%s", s);                if (s[0] != 'x')                    map[i][j] = map[j][i] = atoi(s);            }        spfa();        int ans = 0;        for (int i = 1; i <= n; i++)            if (dis[i] > ans)                ans = dis[i];        printf("%d\n", ans);    }    return 0;}