zoukankan      html  css  js  c++  java
  • POJ3469 & 最小割(最大流)模板

    就是一个求最小割.

    sol:

      数据比较大,n有20000,内部相连的边有20w,这么算算就要存八九十万的边,空间显然降不下来...然而打了dinic并不觉得快很多...最快跑到3800+ms

      然后跪一大爷2000ms出头,他只开了50w的边这是怎么做到的qwq...然后并没有什么显著不同啊他封在一个class里(我根本不知道这玩意儿只知道跟struct差不多)...难道是读入优化打丑了...

      附上他的代码地址:http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=4433085

    Code:

      

    /*==========================================================================
    # Last modified: 2016-03-07 19:49
    # Filename: poj3469.cpp
    # Description: 
    ==========================================================================*/
    #define me AcrossTheSky 
    #include <cstdio> 
    #include <cmath> 
    #include <ctime> 
    #include <string> 
    #include <cstring> 
    #include <cstdlib> 
    #include <iostream> 
    #include <algorithm> 
      
    #include <set> 
    #include <map> 
    #include <stack> 
    #include <queue> 
    #include <vector> 
     
    #define lowbit(x) (x)&(-x) 
    #define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++) 
    #define FORP(i,a,b) for(int i=(a);i<=(b);i++) 
    #define FORM(i,a,b) for(int i=(a);i>=(b);i--) 
    #define ls(a,b) (((a)+(b)) << 1) 
    #define rs(a,b) (((a)+(b)) >> 1) 
    #define getlc(a) ch[(a)][0] 
    #define getrc(a) ch[(a)][1] 
     
    #define maxn 20015
    #define maxm 1000500 
    #define pi 3.1415926535898 
    #define _e 2.718281828459 
    #define INF 1070000000 
    using namespace std; 
    typedef long long ll; 
    typedef unsigned long long ull; 
     
    template<class T> inline 
    void read(T& num) { 
        bool start=false,neg=false; 
        char c; 
        num=0; 
        while((c=getchar())!=EOF) { 
            if(c=='-') start=neg=true; 
            else if(c>='0' && c<='9') { 
                start=true; 
                num=num*10+c-'0'; 
            } else if(start) break; 
        } 
        if(neg) num=-num; 
    } 
    /*==================split line==================*/ 
    int S,T,n,m;
    int sume=1;
    struct Edge{
    	int from,to,cap;
    }e[maxm];
    int first[maxn],d[maxn],next[maxm],cur[maxn];
    bool vis[maxn];
    queue<int> q;
    void addedge(int x,int y,int cap){
    	sume++; e[sume].from=x; e[sume].to=y; e[sume].cap=cap;
    	next[sume]=first[x]; first[x]=sume;
    	sume++; e[sume].from=y; e[sume].to=x; e[sume].cap=0;
    	next[sume]=first[y]; first[y]=sume;
    }
    int bfs(){
    	for(int i=S;i<=T;i++) vis[i]=false;
    	q.push(0); d[0]=0; vis[0]=true;
    	while (!q.empty()){
    		int now=q.front(); q.pop();
    		for (int i=first[now];i;i=next[i])
    			if (!vis[e[i].to] && e[i].cap){
    				d[e[i].to]=d[now]+1;
    				vis[e[i].to]=true;
    				q.push(e[i].to);
    			}
    	}
    	return vis[T];
    }
    int dfs(int now,int a){
    	if (now==T || !a) return a;
    	int f,flow=0;
    	for (int & i=cur[now];i;i=next[i])
    		if (d[now]+1==d[e[i].to] && (f=dfs(e[i].to,min(a,e[i].cap)))>0){
    			flow+=f; a-=f; e[i].cap-=f; e[i^1].cap+=f;
    			if (!a) break;
    		}
    	return flow;
    	
    }
    int dinic(){
    	int flow=0;
    	while (bfs()){
    		FORP(i,0,n) cur[i]=first[i];
    		flow+=dfs(S,INF);
    	}
    	return flow;
    }
    int main(){ 
    	read(n); read(m);
    	FORP(i,1,n) {
    		int x;
    		read(x); addedge(0,i,x);
    		read(x); addedge(i,n+1,x);
    	}
    	FORP(i,1,m){
    		int x,y,z; read(x); read(y); read(z);
    		addedge(x,y,z); addedge(y,x,z);
    	}
    	S=0,T=n+1;
    	printf("%d",dinic());
    }
    
    Sometimes it s the very people who no one imagines anything of. who do the things that no one can imagine.
  • 相关阅读:
    win7颜色反转
    全框眼镜拆卸镜片方法分享
    自定义锁屏图片 win7
    保存chrome主题背景的图片
    广域网设计
    网络方案设计
    电脑不能上网win7 解决办法
    局域网设计
    以太网安全技术ACL原理+配置
    协议无关组播--稀疏模式 PIM-SM
  • 原文地址:https://www.cnblogs.com/YCuangWhen/p/5251971.html
Copyright © 2011-2022 走看看