上下界網路流專題

2021-07-12 04:09:45 字數 3965 閱讀 1554

給定n點m邊無向圖,用k個人從起點出發,乙個人走一條路代價為路的長度li,你希望按照0,1,2,…,n的順序依次經過這些點,其中經過的定義是任何1人經過該點,問k個人最小的道路總和。

n ≤ 150, m ≤ 20 000, 1 ≤ k ≤ 10, li ≤ 10 000

考慮每次只有1個人走1步,已經過t點,

則每次其中一人走向t+1點,距離是所在點到t+1點的最短路(不經過t+1以上的點)

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define for(i,n) for(int i=1;i<=n;i++)

#define fork(i,k,n) for(int i=k;i<=n;i++)

#define rep(i,n) for(int i=0;i#define ford(i,n) for(int i=n;i;i--)

#define repd(i,n) for(int i=n;i>=0;i--)

#define forp(x) for(int p=pre[x];p;p=next[p])

#define forpiter(x) for(int &p=iter[x];p;p=next[p])

#define lson (x<<1)

#define rson ((x<<1)+1)

#define mem(a) memset(a,0,sizeof(a));

#define memi(a) memset(a,127,sizeof(a));

#define memi(a) memset(a,128,sizeof(a));

#define inf (2139062143)

#define f (100000007)

#define maxn (300+10)

#define maxm ((20000)*12+10)

#define eps (1e-3)

long

long mul(long

long a,long

long b)

long

long add(long

long a,long

long b)

long

long sub(long

long a,long

long b)

typedef long

long ll;

class cost_flow

void addedge2(int u,int v,int w,int c)

bool b[maxn];

int d[maxn];

int pr[maxn],ed[maxn];

bool spfa(int s,int t)

}

b[now]=0;

}

return d[t]!=inf;

}

int totcost;

int costflow(int s,int t)

// cout}

void mem(int n,int t)

}s1;

int read()

while(isdigit(ch))

return x*f;

} int n,m,k;

ll f[maxn][maxn]=;

int main()

rep(k,n+1) rep(i,n+1) rep(j,n+1)

// rep(i,n+1)

for(i,n+1)

rep(i,n+1)

} s1.addedge2(s,1,k,0);

fork(i,n+2,2*n+2) s1.addedge2(i,t,inf,0);

s1.addedge2(t,s,k,0);

cout0;}

將矩陣黑白染色,相鄰點連邊,由於貪吃蛇長度至少為3,容易用上下界網路流表示環和頭尾都在邊界的情況

#include

using namespace std;

#define for(i,n) for(int i=1;i<=n;i++)

#define fork(i,k,n) for(int i=k;i<=n;i++)

#define rep(i,n) for(int i=0;i#define ford(i,n) for(int i=n;i;i--)

#define forkd(i,k,n) for(int i=n;i>=k;i--)

#define repd(i,n) for(int i=n;i>=0;i--)

#define forp(x) for(int p=pre[x];p;p=next[p])

#define forpiter(x) for(int &p=iter[x];p;p=next[p])

#define lson (o<<1)

#define rson ((o<<1)+1)

#define mem(a) memset(a,0,sizeof(a));

#define memi(a) memset(a,127,sizeof(a));

#define memi(a) memset(a,128,sizeof(a));

#define inf (2139062143)

#define f (100000007)

#define pb push_back

#define mp make_pair

#define fi first

#define se second

#define vi vector

#define pi pair

#define si(a) ((a).size())

#define pr(kcase,ans) printf("case %d: %lld\n",kcase,ans);

#define pri(a,n) for(i,n-1) cout<#define pri2d(a,n,m) for(i,n)

ll add(ll a,ll b)

ll sub(ll a,ll b)

void upd(ll &a,ll b)

intread()

while(isdigit(ch))

return

x*f;

} class cost_flow

void addedge2(int u,int v,int w,int c)

bool b[maxn];

int d[maxn];

int pr[maxn],ed[maxn];

bool spfa(int

s,int t)

}

b[now]=0;

}

return d[t]!=inf;

}

int totcost,maxflow;

int costflow(int

s,int t)

return totcost;

}

void mem(int n,int t)

}s1;

int n,m;

char s[20][20];

int main()

else

}s1.costflow(ss,tt);

if (s1.maxflow*2)

if (s1.maxflow*2) puts("-1");

else cout<2

0;}

上下界網路流初探

看文章各種不明真相.請教了一下iwtwiioi大牛.大致有個理解.建模過程 1.拆邊.對於每一條給出的有向邊 u,v,c,d 其中c指下界,d指上界,那麼在實際的圖中連三條只有上界沒有下界的邊 s,v,c u,t,c u,v,d c 其中s是超級源,t是超級匯.不同於題目給出的源與匯 一條是超級源連...

有上下界網路流

前言 下面寫得只是一些十分基礎的東西,是給我以後自己看的,想要徹底弄明白這個內容,推薦去看liu runda。注 為了方便,下面所有的 x,y,l,r 都表示一條從x連向y,流量下界為l,流量上界為r的邊。問題簡述 給出乙個有向圖,每條邊有流量上下界,沒有源點和匯點,要求找到一種流的方法,使得每個點...

上下界網路流總結

orz zhhx orz yyb orz aysn 無源匯可行流 每條邊取 l i 最大流調整 有源匯可行流 e t,s,inf 無源匯可行流 有源匯最小流 有源匯可行流 去掉 inf 邊 t rightarrow s 最大流 有源匯最大流 有源匯可行流 去掉 inf 邊 s rightarrow ...