日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]膜板題 ->排水溝poj1273 網(wǎng)絡(luò)流弄了將近一個月,寒假玩v家去了導(dǎo)致信息競賽進(jìn)度不大,不過還是先總結(jié)一下吧 一些概念 一 網(wǎng)絡(luò)流滿足三個性質(zhì): 1 容量限制 每條邊不能夠提供大

膜板題 ->排水溝poj1273
網(wǎng)絡(luò)流弄了將近一個月,寒假玩v家去了導(dǎo)致信息競賽進(jìn)度不大,不過還是先總結(jié)一下吧

一些概念

一 網(wǎng)絡(luò)流滿足三個性質(zhì):
1 容量限制
每條邊不能夠提供大于其流量的邊,(反向邊要加上對應(yīng)的增廣流量是為了滿足流量守恒)
2 對稱性
f(u,v)=-f(v,u)
3 流量守恒
所有點(diǎn)的流入量等于流出量
通俗點(diǎn)說就是你不能從1號城市運(yùn)3個冰球到2號,而運(yùn)到2號的再傳到3號城市的冰球變成了1個(好吧很意義不明)

二 增廣路
能走的路一定是還有流量的路,
而增廣路是從s->t還能多增加流的路。

三 交替路
二分圖從一端到另一端,走一邊到另一邊再到原來的一邊的非同一個頂點(diǎn)的路是交替路(比較通俗)

存圖方式

用vector模擬鄰接表

struct edge
{
int to,cap,rev;
};

其中cap是剩余容量,rev是反向邊(和劉汝佳方法不一樣)推薦白書上那種 方便

關(guān)于兩個模板,fulkerson(我老是打錯成**)和dinic算法
我們先來說一下fulkerson算法吧

fulkerson算法 復(fù)雜度O(F|E|)

用dfs找增廣路 為了不走回頭路,我們使用數(shù)組標(biāo)記
一條路能走當(dāng)且僅當(dāng)它的剩余容量大于0,那么我們只需要不斷地沿著路dfs就行了,唯一注意的是,我們要在增廣一條路后去掉對應(yīng)的容量 并把反向邊加上容量(根據(jù)容量守恒原則)
沒什么很難的地方
代碼 可以練好后交poj1273

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int maxn=500;
const int inf=0x3f3f3f3f;
struct edge
{
    int to;
    int cap,rev;
    void ini()
    {
        to=0;
        cap=0;
        rev=0;
    }
};
vector g[maxn];
bool used[maxn];
int s,t,n,m;
int ans=0;


void addedge(int from,int to,int cap)
{
    g[from].push_back((edge){to,cap,g[to].size()});
    g[to].push_back((edge){from,0,g[from].size()-1});
}

int dfs(int v,int t,int f)
{
    if(v==t) return f;
    used[v]=true;
    for(unsigned i=0;i0)
        {
            int d;
            d=dfs(buffer.to,t,min(f,buffer.cap));
            if(d>0)
            {
                g[v][i].cap-=d;
                g[buffer.to][buffer.rev].cap+=d;
                return d;
            }
        }
    }
    return 0;
}

int max_flow(int st,int ed)
{
    ans=0;
    while(1)
    {
        memset(used,0,sizeof(used));
        int buff=dfs(st,ed,inf);
        if(buff==0) return ans;
        else
        {
            ans+=buff;
        }
    }
}

int main()
{
    while(scanf("%d%d",&m,&n)==2)
    {
        s=1;
        t=n;
        for(int i=0;i
dinic算法 復(fù)雜度O(|V||V||E|) 上界比較松

將圖分層,
對于一個圖,每一次增廣一定有一條路會斷(即沒有剩余容量)
這時我們記一個dis 數(shù)組來記起點(diǎn)到各個點(diǎn)的距離(我們暫時只考慮所有cost為1的情況)
這樣可以保證不對一條沒用的邊進(jìn)行多次檢查,節(jié)省了時間,其余與深搜類似

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//手寫隊(duì)列
//AC
using namespace std;

const int maxn=5000000;
const int inf=0x3f3f3f3f;
struct edge
{
    int to;
    int cap;
    int rev;
};
vector g[maxn];
int dis[maxn];
int cur[maxn];
int q[maxn];
int s,t,n,m;
int res=0;

int readint()
{
    char c;
    int ans=0;
    while(c=getchar())
    {
        if(isdigit(c))
        {
            ans=ans*10+c-'0';
        }
        else c=getchar();
    }
    return ans;
}

void addedge(int from,int to,int cap)
{
    g[from].push_back((edge){to,cap,g[to].size()});
    g[to].push_back((edge){from,0,g[from].size()-1});
}

void bfs()
{
    memset(dis,-1,sizeof(dis));
    memset(q,0,sizeof(q));
    int hd=0;
    int tl=0;
    q[hd]=s;
    dis[s]=0;
    while(hd<=tl)
    {
        int head=q[hd];
        hd++;
        for(unsigned i=0;i0 && dis[e.to]<0)
            {
                dis[e.to]=dis[head]+1;
                tl++;
                q[tl]=e.to;
            }
        }
    }
}

int dfs(int v,int ed,int flow)
{
    int f;
    if(v==ed)
    {
        return flow;
    }
    else
    {
        for(int &i=cur[v];i0 && dis[e.to]==dis[v]+1)
            {
                f=dfs(e.to,ed,min(flow,e.cap));
                if(f>0)
                {
                    e.cap-=f;
                    g[e.to][e.rev].cap+=f;//注意結(jié)構(gòu)體后要帶成員
                    return f;
                }
            }
        }
    }
    return 0;
}

int max_flow(int st,int ed)
{
    int ans=0;
    while(1)
    {
        bfs();
        if(dis[t]<0) return ans;
        else
        {
            memset(cur,0,sizeof(cur));
            int f;
            while((f=dfs(st,ed,inf))>0)
            {
                ans+=f;
            }
        }
    }
}

int main()
{
    scanf("%d%d%d%d",&n,&m,&s,&t);
        res=0;
        for(int i=0;i
二分圖匹配的網(wǎng)絡(luò)流變形

對于一個二分圖,我們想到如果將最大匹配轉(zhuǎn)化為最大流就好了。
那么如何轉(zhuǎn)化呢?對于一個匹配,一定是數(shù)條沒有公共頂點(diǎn)的邊,那么就想到了數(shù)條這樣相同流的增廣路
我們添加一個源點(diǎn)和匯點(diǎn),它們分別向兩邊的兩點(diǎn)各連一條容量為1,cost=0的邊,這樣就轉(zhuǎn)化為了最大流來求這些邊的問題了

#include 
#include 
#include 
#include 
#include 
#include 
//AC
using namespace std;

const int maxn=10000;
const int inf=0x3f3f3f3f;
int dis[maxn];
int cur[maxn];
int s,t,n,m,e;

struct edge
{
    int to,cap,rev;
};
vector g[maxn];

void addedge(int from,int to,int cap)
{
    g[from].push_back((edge){to,cap,g[to].size()});
    g[to].push_back((edge){from,0,g[from].size()-1});
}
//dinic
bool bfs(int st,int ed)
{
    memset(dis,inf,sizeof(dis));
    int q[maxn];
    int head=0;
    int tail=0;
    q[head]=st;
    dis[st]=0;
    while(head<=tail)
    {
        int h=q[head];
        head++;
        for(unsigned i=0;i0 && dis[e.to]==inf)
            {
                dis[e.to]=dis[h]+1;
                tail++;
                q[tail]=e.to;
            }
        }
    }
    return (dis[ed]!=inf);
}

int dfs(int v,int ed,int leftflow)
{
    if(leftflow==0 || v==ed)
    {
        return leftflow;
    }
    else
    {
        for(int &i=cur[v];i0 && dis[e.to]==dis[v]+1)/////
            {
                int f=dfs(e.to,ed,min(leftflow,e.cap));
                if(f>0)
                {
                    e.cap-=f;///////////////////
                    g[e.to][e.rev].cap+=f;///////////////
                    return f;
                }
            }
        }
        return 0;
    }
}

int main()
{
    scanf("%d%d%d",&n,&m,&e);
    s=0;
    t=n+m+1;
    memset(dis,inf,sizeof(dis));
    memset(cur,0,sizeof(cur));
    for(int i=0;i=1 && from<=n && to>=1 && to<=m)
        {
            to+=n;
            addedge(from,to,1);
        }
    }
    for(int i=1;i<=n;i++)
    {
        addedge(s,i,1);
    }
    for(int j=n+1;j<=n+m;j++)
    {
        addedge(j,t,1);
    }
    int ans=0;
    while(bfs(s,t))
    {
        int f;
        memset(cur,0,sizeof(cur));/////////////
        while((f=dfs(s,t,inf))>0)
        {
            ans+=f;
        }
    }
    printf("%dn",ans);
    return 0;
}
固定流最小費(fèi)用流問題

給你10個冰球,你要運(yùn)完,但是你要經(jīng)過長度最小的道路
如何做呢?這里推薦一個用連續(xù)最短路的貝爾曼福德實(shí)現(xiàn)的算法:
流固定,每次以最短路增廣,從流中減去對應(yīng)流
這樣寫看上去比較好懂的


int min_cost_flow(int st,int ed,int f)
{
    int ans=0;
    while(f>0)
    {
        bool update=true;
        memset(dis,inf,sizeof(dis));
        dis[st]=0;
        while(update)
        {
            update=false;
            for(int i=0;i<=n+m+1;i++)
            {
                if(dis[i]!=inf)
                {
                    for(unsigned j=0;j0 && dis[e.to]>dis[i]+e.cost)
                        {
                            dis[e.to]=dis[i]+e.cost;
                            prevv[e.to]=i;
                            preve[e.to]=j;
                            update=true;
                        }
                    }
                }
            }
        }

        if(dis[ed]==inf)
        {
            return -1;
        }

        int d=inf;
        for(int i=ed;i!=st;i=prevv[i])
        {
            d=min(d,g[prevv[i]][preve[i]].cap);
        }

        f-=d;
        ans+=dis[ed]*d;
        for(int i=ed;i!=st;i=prevv[i])
        {
            edge & e=g[prevv[i]][preve[i]];
            e.cap-=d;
            g[i][e.rev].cap+=d;
        }
    }
    return ans;
}

應(yīng)用當(dāng)然不止這些 最主要是建模,這里有些題(書上的例題)
poj1273排水溝
poj3281奶牛的餐飲
poj3686玩具
luogu3386二分圖匹配模板

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉