• poj 1734 floyd求最小环,可得到环上的每个点


    #include<stdio.h>
    #include<string.h>
    #define inf  100000000
    #define N 110
    #define min(a,b) a>b?b:a;
    int pre[N][N],dis[N][N],ma[N][N],path[N],num,minf;
    int n,m;
    void FLOYD() {
     int i,j,k,s,p;
     minf=inf;
     for(k=1;k<=n;k++) {
      for(i=1;i<k;i++)
      for(j=i+1;j<k;j++) {
        s=dis[i][j]+ma[i][k]+ma[k][j];
        if(s<minf) {
            num=0;
            minf=s;
            p=j;
            while(p!=i) {
                path[num++]=p;
                p=pre[i][p];
            }
            path[num++]=i;
            path[num++]=k;
        }
      }
      for(i=1;i<=n;i++)
      for(j=1;j<=n;j++) {
        s=dis[i][k]+dis[k][j];
        if(dis[i][j]>s) {
            dis[i][j]=s;
            pre[i][j]=pre[k][j];
        }
      }
     }
    }
    int main() {
        int i,j,v,u,w;
        while(scanf("%d%d",&n,&m)!=EOF) {
          for(i=1;i<=n;i++)
          for(j=1;j<=n;j++) {
           dis[i][j]=inf;
           ma[i][j]=inf;
           pre[i][j]=i;
          }
          num=0;
          while(m--) {
            scanf("%d%d%d",&u,&v,&w);
            w=min(dis[u][v],w);
            dis[u][v]=dis[v][u]=ma[u][v]=ma[v][u]=w;
          }
          FLOYD();
          if(minf==inf) {
            printf("No solution. ");
            continue;
          }
          printf("%d",path[0]);
          for(i=1;i<num;i++)
            printf(" %d",path[i]);
          printf(" ");
        }
    return 0;
    }

  • 相关阅读:
    滤镜
    android 判断网络是否断开
    U5
    android 界面跳转
    光影魔术手 图片压缩
    服务器绑定 独立ip
    Java 开源 SOCKET 框架
    spring aop ehcache
    呼叫中心
    华丽字体
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410781.html
Copyright © 2020-2023  润新知