點選打開連結
hdu這個題卡時間 之前的EK和dinic闆子根本過不了 才換成了isap
但是對isap還有一些不了解的地方 留個坑吧..
poj上還有一道基本一樣的
hdu 3572
#include <bits/stdc++.h>
using namespace std;
#define N 0x3f3f3f3f
struct node
{
int v;
int w;
int next;
};
queue <int> que;
node edge[200010];
int first[100010],dis[100010],gap[100010],cur[100010],pre[100010];
int n,m,num,ss,ee;
void addedge(int u,int v,int w)
{
edge[num].v=v;
edge[num].w=w;
edge[num].next=first[u];
first[u]=num++;
return;
}
void bfs()
{
int i,u,v;
while(!que.empty()) que.pop();
memset(dis,-1,sizeof(dis));
memset(gap,0,sizeof(gap));
que.push(ee);
dis[ee]=0;
gap[0]++;
while(!que.empty())
{
u=que.front();
que.pop();
for(i=first[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(dis[v]==-1)
{
que.push(v);
dis[v]=dis[u]+1;
gap[dis[v]]++;
}
}
}
return;
}
int isap()
{
int j,u,v,w,flow,minn,ans;
bfs();
memcpy(cur,first,sizeof(first));
memset(pre,-1,sizeof(pre));
u=ss,flow=N,ans=0;
while(dis[ss]<num)
{
int &i=cur[u];
for(;i!=-1;i=edge[i].next)
{
v=edge[i].v,w=edge[i].w;
if(dis[v]+1==dis[u]&&w>0)
{
pre[v]=i;
u=v,flow=min(flow,w);
if(u==ee)
{
while(u!=ss)
{
edge[pre[u]].w-=flow;
edge[pre[u]^1].w+=flow;
u=edge[pre[u]^1].v;
}
ans+=flow,flow=N;
}
break;
}
}
if(i==-1)
{
if(--gap[dis[u]]==0) break;
cur[u]=first[u];
minn=num-1;
for(j=first[u];j!=-1;j=edge[j].next)
{
v=edge[j].v,w=edge[j].w;
if(w>0)
{
minn=min(minn,dis[v]);
}
}
dis[u]=minn+1;
gap[dis[u]]++;
if(u!=ss) u=edge[pre[u]^1].v;
}
}
return ans;
}
int main()
{
int t,cas,i,j,p,s,e,sum,res;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
scanf("%d%d",&n,&m);
memset(first,-1,sizeof(first));
num=0,ss=n+500+1,ee=n+500+2,sum=0;
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&p,&s,&e);
addedge(ss,i,p);
addedge(i,ss,0);
sum+=p;
for(j=s;j<=e;j++)
{
addedge(i,n+j,1);
addedge(n+j,i,0);
}
}
for(i=n+1;i<=n+500;i++)
{
addedge(i,ee,m);
addedge(ee,i,0);
}
num=n+500+2;
res=isap();
if(res>=sum) printf("Case %d: Yes\n\n",cas);
else printf("Case %d: No\n\n",cas);
}
return 0;
}
poj 1698
#include <stdio.h>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1e9
struct node
{
int v;
int w;
int next;
};
node edge[100010];
int first[1010],dis[1010],gap[1010],cur[1010],pre[1010];
int n,num,ss,ee,ans;
void addedge(int u,int v,int w)
{
edge[num].v=v;
edge[num].w=w;
edge[num].next=first[u];
first[u]=num++;
return;
}
void isap();
void bfs();
int main()
{
int film[10];
int t,i,j,k,d,w,sum;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(first,-1,sizeof(first));
num=0,ss=n+350+1,ee=n+350+2,sum=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=7;j++)
{
scanf("%d",&film[j]);
}
scanf("%d%d",&d,&w);
sum+=d;
addedge(ss,i,d);
addedge(i,ss,0);
for(j=0;j<w;j++)
{
for(k=n+j*7+1;k<=n+j*7+7;k++)
{
if(film[k-n-j*7]==1)
{
addedge(i,k,1);
addedge(k,i,0);
}
}
}
}
for(i=n+1;i<=n+350;i++)
{
addedge(i,ee,1);
addedge(ee,i,0);
}
num=n+350+2;
isap();
if(ans>=sum) printf("Yes\n");
else printf("No\n");
}
return 0;
}
void isap()
{
int j,u,v,flow,minn;
bfs();
memcpy(cur,first,sizeof(first));
memset(pre,-1,sizeof(pre));
ans=0,u=ss,flow=N;
while(dis[ss]<num)
{
int &i=cur[u];
for(;i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(dis[v]+1==dis[u]&&edge[i].w>0)
{
pre[v]=i;
u=v,flow=min(flow,edge[i].w);
if(u==ee)
{
while(u!=ss)
{
j=pre[u];
edge[j].w-=flow;
edge[j^1].w+=flow;
u=edge[j^1].v;
}
ans+=flow,flow=N;
}
break;
}
}
if(i==-1)
{
if(--gap[dis[u]]==0) break;
cur[u]=first[u];
minn=num-1;
for(j=first[u];j!=-1;j=edge[j].next)
{
if(edge[j].w>0)
{
minn=min(minn,dis[edge[j].v]);
}
}
dis[u]=minn+1;
gap[dis[u]]++;
if(u!=ss)
{
u=edge[pre[u]^1].v;
}
}
}
return;
}
void bfs()
{
queue <int> que;
int i,u,v;
memset(dis,-1,sizeof(dis));
memset(gap,0,sizeof(gap));
que.push(ee);
dis[ee]=0;
while(!que.empty())
{
u=que.front();
que.pop();
gap[dis[u]]++;
for(i=first[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(dis[v]==-1)
{
dis[v]=dis[u]+1;
que.push(v);
}
}
}
return;
}