給定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 ...