• 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);
       }
    }
  • 相关阅读:
    前面的内容 也是要去掉白名单 和 8.8.8.8这种非问题IP的 高风险 么? (目前我们没有获取客户的中风险、低风险数据,可以处理掉高风险)
    大数据安全规范
    queue
    数据源、数据集、同步任务、数据仓库、元数据、数据目录、主题、来源系统、标签、增量识别字段、修改同步、ES索引、HBase列族、元数据同步、
    软件架构的5种视图
    软件各种系统架构图
    为何要建数据仓库 大数据下的企业数据仓库建设
    choorme 升级到最新版 adobe flash提示过期解决方案
    PowerShell控制台快捷键
    [Azure] 使用 Visual Studio 2013 管理中国版 Azure 订阅
  • 原文地址:https://www.cnblogs.com/mfys/p/7261030.html
Copyright © 2020-2023  润新知