[poj1734]Sightseeing trip(Floyd)

来源:互联网 发布:郑州顶尖网络 编辑:程序博客网 时间:2024/05/16 11:37

链接

大体意思:找一个无向图的最小环并输出路径

floyd找最小环

#include<iostream>#include<cstdio>using namespace std;const int maxn = 300;const int inf = 1<<29;int n,m;int a[maxn][maxn],p[maxn][maxn],f[maxn][maxn],head[maxn],tot = 0;int u1,v1;int ans = inf;void floyd() {    for(int k = 1; k <= n; k++) {        for(int i = 1; i < k; i++) {            for(int j = i + 1; j < k;j++) {                if(f[i][j] + a[i][k] + a[k][j] < ans) {                    ans = f[i][j] + a[i][k] + a[k][j];                    tot = 0;                    int t = i;                    while(t != j) {                        head[++tot] = t;                        t = p[t][j];                    }                    head[++tot] = t;                    head[++tot] = k;                }            }        }        for(int i = 1; i <= n; i++) {            for(int j = 1; j <= n; j++) {                if(f[i][j] > f[i][k] + f[k][j]) {                    f[i][j] = f[i][k] + f[k][j];                    p[i][j] = p[i][k];                }            }        }    }}int main() {    cin>>n>>m;    for(int i = 1; i <= n; i++) {        for(int j = 1; j <= n; j++) {            a[i][j] = inf;            if(i == j) a[i][j] = 0;            f[i][j] = inf;            if(i == j) f[i][j] = 0;            p[i][j] = j;        }    }    for(int i = 1; i <= m; i++) {        int u,v,w;        cin>>u>>v>>w;        if(w < a[u][v]) {            a[u][v] = a[v][u] = w;            f[v][u] = f[u][v] = w;        }    }    floyd();    if(ans == inf) cout<<"No solution."<<endl;    else {        for(int i = 1; i <= tot; i++) cout<<head[i]<<' ';    }    return 0;}