zoukankan      html  css  js  c++  java
  • Floyd求最小环

    首先求最小环有一个比较好想的方法:每次删掉一条边,看看这条边n所连的点i之间的距离(dijkstra),时间复杂度O(m*V^2*logv)

    其实floyd也能完成这个功能。f[i][j][k]表示i到j在中间点为1~k的最近距离

    对于一个环,我们假设i和j中只夹这一个数k,则环长为f[i][j][k-1]+map[i][k]+map[k][j],枚举一下

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define rep(i,a,b) for(int i=a;i<=b;++i)
    using namespace std;
    int n,map[1005][1005],dist[1005][1005],Min;
    void have_done()
    {
        rep(k,1,n)
        {
            rep(i,1,k-1)
            {
                rep(j,1,k-1)
                {
                    if(map[i][k]+map[k][j]+dist[i][j]<Min)
                    {
                        Min=map[i][k]+map[k][j]+dist[i][j];
                    }
                    dist[i][j]=min(dist[i][j],map[i][k]+map[k][j]);
                }
    
            }
        }
    }
    int main()
    {
        Min=100000;
        scanf("%d",&n);
        rep(i,1,n)
            rep(j,1,n)
            {
                scanf("%d",&map[i][j]);
            }
        have_done();
        cout<<Min<<endl;
    }
  • 相关阅读:
    批量修改图片尺寸
    批量修改文件名
    C++ 字符串的编码
    Hanoi问题
    农夫过河问题
    遍历文件夹中所有图片
    仿射变换和透射变换
    程序局部性原理
    14年年底的学习计划
    linux之Vim使用
  • 原文地址:https://www.cnblogs.com/dancer16/p/7130267.html
Copyright © 2011-2022 走看看