ural 1004(floyd 求最小环)

来源:互联网 发布:jade软件使用 编辑:程序博客网 时间:2024/06/05 20:05

poj暂时出问题。。就先做一个这里的题了。。。。简单题。。。。求无向图的最小环。。。floyd算法。。。。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int inf = 100000000;int maze[110][110], dis[110][110], path[110], pi;int pre[110][110];void get_path(int p1, int p2) {    if (pre[p1][p2]) {        get_path(p1, pre[p1][p2]);        get_path(pre[p1][p2], p2);    } else        path[pi++] = p1;}inline bool check(int i, int j, int k) {    if (i!=j && j!=k && k!=i)        return 1;    return 0;}int main() {    int n, m, i, j, k, mi, u, v;    while (scanf("%d", &n) && n > 0) {        scanf("%d",&m);        for (i = 1; i <= n; i++)            for (j = 1; j <= n; j++)                maze[i][j] = dis[i][j] = inf, pre[i][j] = 0;        for (i = 1; i <= m; i++) {            scanf("%d%d%d", &u, &v, &k);            if(k<maze[u][v])                maze[u][v] = maze[v][u] = dis[u][v] = dis[v][u] = k;        }        for (mi = inf, k = 1; k <= n; k++) {            for (i = 1; i <= n; i++)                for (j = 1; j <= n; j++)                    if (check(i, j, k) && (dis[i][j] + maze[j][k] + maze[k][i] < mi)) {                        mi = dis[i][j] + maze[j][k] + maze[k][i];                        pi = 0, get_path(i, j), path[pi++] = j, path[pi++] = k;                    }            for (i = 1; i <= n; i++)                for (j = 1; j <= n; j++)                    if (check(i,j,k) && dis[i][k] + dis[k][j] < dis[i][j])                        dis[i][j] = dis[i][k] + dis[k][j], pre[i][j] = k;        }        if (mi == inf)            puts("No solution.");        else {            for (i = 0; i < pi - 1; i++)                printf("%d ", path[i]);            printf("%d\n", path[pi - 1]);        }    }    return 0;}


原创粉丝点击