網路流+拆點+sap+uva10330
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=210;
const int INF=0x3f3f3f3f;
struct node
{
int v,next,f;
} edge[maxn*maxn];
int pre[maxn],cur[maxn],gap[maxn],head[maxn],dis[maxn];
int N,M,num,B,D,nn;
void init()
{
num=0;
memset(head,-1,sizeof(head));
}
void add_edge(int a,int b,int x)
{
edge[num].v=b;
edge[num].next=head[a];
edge[num].f=x;
head[a]=num++;
edge[num].v=a;
edge[num].next=head[b];
edge[num].f=0;
head[b]=num++;
}
int SAP(int s,int t)
{
for(int i=0; i<=nn; i++)
{
cur[i]=head[i];
gap[i]=dis[i]=0;
}
int u;
int flow=0,aug=INF;
gap[s]=nn;
u=pre[s]=s;
bool flag;
while(dis[s]<nn)
{
flag=0;
for(int &j=cur[u]; j!=-1; j=edge[j].next)
{
int v=edge[j].v;
if(edge[j].f>0&&dis[u]==dis[v]+1)
{
flag=1;
if(edge[j].f<aug)
aug=edge[j].f;
pre[v]=u;
u=v;
if(u==t)
{
flow+=aug;
while(u!=s)
{
u=pre[u];
edge[cur[u]].f-=aug;
edge[cur[u]^1].f+=aug;
}
aug=INF;
}
break;
}
}
if(flag) continue;
int mindis=nn;
for(int j=head[u];j!=-1;j=edge[j].next)
{
int v=edge[j].v;
if(dis[v]<mindis&&edge[j].f>0)
{
mindis=dis[v];
cur[u]=j;
}
}
if((--gap[dis[u]])==0)
break;
gap[dis[u]=mindis+1]++;
u=pre[u];
}
return flow;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int a,b,x;
while(cin>>N)
{
init();
for(int i=1; i<=N; i++)
{
cin>>x;
add_edge(i,i+N,x);
}
cin>>M;
for(int i=0; i<M; i++)
{
cin>>a>>b>>x;
add_edge(a+N,b,x);
}
cin>>B>>D;
for(int i=1; i<=B; i++)
{
cin>>a;
add_edge(0,a,INF);
}
for(int i=1; i<=D; i++)
{
cin>>a;
add_edge(a+N,2*N+1,INF);
}
nn=2*(N+1);
cout<<SAP(0,2*N+1)<<endl;
}
return 0;
}
下面是EK
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<string>
#include<cmath>
#include<fstream>
#include<iomanip>
using namespace std;
#define MAX_INT 0x7fffffff
#define MAX_LL 0x7fffffffffffffff
#define ULL unsigned long long
#define LL long long
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#define MAXN 222
#define MAXM 22222
#define INF (MAX_INT>>1)
int cap[MAXN][MAXN];
int n,m,b,d;
int flow[MAXN][MAXN];
int p[MAXN];
queue<int> q;
int Edmonds_Karp(int s, int t){
int a[MAXN],f=0;
memset(flow,0,sizeof(flow)); //從0開始
while(!q.empty()) q.pop();
while(1){
memset(a,0,sizeof(a));
a[s]=INF; q.push(s); //000
while(!q.empty()){ //BFS
int u=q.front(); q.pop();
for(int v=0; v<=n; v++) if(!a[v] && cap[u][v]>flow[u][v]){
a[v]=MIN(a[u],cap[u][v]-flow[u][v]); //更新,還不特別清楚。。。
p[v]=u; q.push(v);
}
}
if(!a[t]) break;
for(int v=t; v!=s; v=p[v]){
flow[p[v]][v]+=a[t]; //更新當前流量
flow[v][p[v]]-=a[t];
}
f+=a[t];
}
return f;
}
int main(){
//freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
while(scanf(" %d",&n)==1){
int i,j,t2,t1,w_;
memset(cap,0,sizeof(cap)); //拆點,把點i拆成i、n+i
for(i=1; i<=n; i++) scanf(" %d",&cap[i][n+i]);
scanf(" %d",&m);
for(i=1; i<=m; i++){
scanf(" %d %d %d",&t1,&t2,&w_);
cap[n+t1][t2]=w_; //注意弧的始終點
}
scanf(" %d %d",&b,&d);
for(i=1; i<=b; i++){
scanf(" %d",&t1);
cap[0][t1]=INF;
}
for(i=1; i<=d; i++){
scanf(" %d",&t1);
cap[t1+n][2*n+1]=INF;
}
n=n*2+1;
cout<<Edmonds_Karp(0,n)<<endl;
}
return 0;
}
相關文章
- 網路流拆點法和分配結點和超級源點匯點的應用
- 【網路流】網路流基本概念
- 網路流
- 網路流初步
- BZOJ 3931 [CQOI2015]網路吞吐量:最大流【拆點】
- 關於網路流
- 圖論——網路流圖論
- 網路流總結
- 網路流最大流
- 網路流相關
- 網路流-最小割
- 上下界網路流
- 網路流大雜燴
- 【模板】網路流最大流
- 網路流概念補充
- 網路流&費用流&二分圖
- 網路流練習筆記筆記
- 【學習筆記】網路流筆記
- 圖的匹配與網路流
- 【筆記/模板】網路流初步筆記
- 網路流學習筆記筆記
- 網路流(最大流,最小割)
- Git 倉庫拆拆拆Git
- 多點對多點網路模式的網路特徵模式特徵
- 計算機網路 - TCP粘包、拆包以及解決方案計算機網路TCP
- 網路黑客節慶狂歡趨勢科技見招拆招黑客
- 雅虎宣佈暫停分拆阿里股份剝離核心網際網路業務阿里
- HDU 2732 Leapin' Lizards(拆點+最大流)API
- 【自用】有上下界的網路流
- 網路流複雜度證明複雜度
- Contest5400 - 網路流-1
- 時間流網際網路之未來(上)
- 【網路流】有源匯上下界最大流
- 狀壓 + 網路流 -- Escape HDU - 3605
- 簡單講講上下界網路流
- P3376 網路流【模板】
- 「趣圖」網際網路公司的聖誕樹,確定不是機房拆剩下的嗎?
- 世界網際網路大會|網路安全點亮烏鎮“網際網路之光”