zoukankan      html  css  js  c++  java
  • poj2914无向图的最小割

    http://blog.csdn.net/vsooda/article/details/7397449

    //算法理论 http://www.cnblogs.com/ylfdrib/archive/2010/08/17/1801784.html

    http://blog.csdn.net/i_love_home/article/details/9698791

     以上是参考的博客

    无向图的最小割我的理解就是先固定一个点,那么其余的点和他的关系就是是否在同一个集合内,既然要求最小割那么和他相连的最大的边最开始肯定是不切割的,而是将它看做和固定点同一个集合用于更新其余点的距离状态,而按照这样贪心的话只能保证局部最优而保证不了全局最优,因为可能与固定点连的最小的边的点可能和其余的点有一个非常大的连边,所以需n次循环弥补,相当于对每种可能的情况都进行了探索,有点贪心加枚举的感觉,向每一个有可能最优的情况探索,这样就大大减小了搜索的范围,然后又因为每次执行的步骤都一样,所以也被人叫迭代?。很有意思的一个算法。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    const int N=606;
    using namespace std;
    int mat[N][N];
    int res;
    void Mincut(int n)  //注意写的时候不要丢node
    {
        int dist[N],node[N];
        bool vis[N];
        for(int i=0; i<n; ++i) node[i]=i;
        while(n>1)
        {
            int maxx=1,prev=0;
            for(int i=1; i<n; ++i)
            {
                dist[node[i]]=mat[node[0]][node[i]];
                if(dist[node[i]]>dist[node[maxx]]) maxx=i;
            }
            memset(vis,0,sizeof(vis));  //每次都要更新vis
            vis[node[0]]=1;
            for(int i=1; i<n; ++i)
            {
                if(i==n-1)
                {
                    res=min(res,dist[node[maxx]]);
                    for(int k=0; k<n; ++k)
                        mat[node[k]][node[prev]]=(mat[node[prev]][node[k]]+=mat[node[maxx]][node[k]]);  //看清楚這
                    node[maxx]=node[--n];
                }
                vis[node[maxx]]=1;
                prev=maxx;
                maxx=-1;
                for(int j=1; j<n; ++j) if(!vis[node[j]])
                {
                    dist[node[j]]+=mat[node[prev]][node[j]];  //更新的时候注意是prev,因为在更新的时候顺便把下一次循环的最大值搞了出来
                    if(maxx==-1||dist[node[j]]>dist[node[maxx]])  
                        maxx=j;
                }
            }
        }
        return ;
    }
    int main(){
       int n,m;
       while(scanf("%d%d",&n,&m)!=EOF){
        res=100861199;
        int u,v,w;
        memset(mat,0,sizeof(mat));
        while(m--){
            scanf("%d%d%d",&u,&v,&w);
            mat[u][v]+=w;
            mat[v][u]+=w;
        }
        Mincut(n);
        printf("%d
    ",res);
       }
    }
  • 相关阅读:
    论文笔记之:Playing for Data: Ground Truth from Computer Games
    【计算机视觉领域】常用的 feature 提取方法,feature 提取工具包
    论文阅读之:Is Faster R-CNN Doing Well for Pedestrian Detection?
    论文笔记之:Generative Adversarial Nets
    如果读取图像的图像出现坏图,无法读取的怎么办?怎么自动跳过坏的图像,而读取下一张?
    (转)A Beginner's Guide To Understanding Convolutional Neural Networks
    (转) Written Memories: Understanding, Deriving and Extending the LSTM
    如果将彩色图像和灰度图像一起放进 CNN 中去,会是什么结果?
    3D CNN for Video Processing
    nodejs(四) --- cluster模块详解
  • 原文地址:https://www.cnblogs.com/mfys/p/7261030.html
Copyright © 2011-2022 走看看