题意可以参考:http://blog.csdn.net/lyy289065406/article/details/6784658
这个题算是这几天很郁闷的题,开始无限TLE,后来发现是很白痴的错误,给出2种Dinic优化的代码吧
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=110;
const int maxm=50010;
const double inf=1000000.0;
int n,m,l,st,des,e,head[maxn],pnt[maxm],nxt[maxm],level[maxn],q[maxn];
double cost[maxm];
void AddEdge(int u,int v,double c)
{
pnt[e]=v;nxt[e]=head[u];cost[e]=c;head[u]=e++;
pnt[e]=u;nxt[e]=head[v];cost[e]=0;head[v]=e++;
}
bool BFS()
{
memset(level,0,sizeof(level));
level[st]=1;
int pre=0,last=1;
q[pre]=st;
while(pre<last)
{
if(q[pre]==des)
return true;
for(int i=head[q[pre]];i!=-1;i=nxt[i])
if(cost[i]&&!level[pnt[i]])
{
level[pnt[i]]=level[q[pre]]+1;
q[last++]=pnt[i];
}
pre++;
}
return level[des];
}
double DFS(int u,double sum)
{
if(u==des||!sum)
return sum;
double ans=0;
for(int i=head[u];i!=-1&&sum>ans;i=nxt[i])
if(cost[i]&&level[pnt[i]]==level[u]+1)
{
double t=DFS(pnt[i],min(sum-ans,cost[i]));
if(t==0)
{
level[pnt[i]]=0;
continue;
}
cost[i]-=t;
cost[i^1]+=t;
ans+=t;
}
return ans;
}
void Dinic()
{
double ans=0;
while(BFS())
ans+=DFS(st,inf);
printf("%.4f\n",exp(ans));
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
e=0;
memset(head,-1,sizeof(head));
scanf("%d%d%d",&n,&m,&l);
st=0,des=n+m+1;
for(int i=1;i<=n;i++)
{
double c;
scanf("%lf",&c);
AddEdge(st,i,log(c));
}
for(int i=1;i<=m;i++)
{
double c;
scanf("%lf",&c);
AddEdge(i+n,des,log(c));
}
for(int i=1;i<=l;i++)
{
int u,v;
scanf("%d%d",&u,&v);
AddEdge(u,v+n,inf);
}
Dinic();
}
return 0;
}
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=110;
const int maxm=50010;
const double inf=1000000.0;
int n,m,l,st,des,e,head[maxn],pnt[maxm],nxt[maxm],level[maxn],q[maxn];
double cost[maxm];
void AddEdge(int u,int v,double c)
{
pnt[e]=v;nxt[e]=head[u];cost[e]=c;head[u]=e++;
pnt[e]=u;nxt[e]=head[v];cost[e]=0;head[v]=e++;
}
bool BFS()
{
memset(level,0,sizeof(level));
level[st]=1;
int pre=0,last=1;
q[pre]=st;
while(pre<last)
{
if(q[pre]==des)
return true;
for(int i=head[q[pre]];i!=-1;i=nxt[i])
if(cost[i]&&!level[pnt[i]])
{
level[pnt[i]]=level[q[pre]]+1;
q[last++]=pnt[i];
}
pre++;
}
return level[des];
}
double DFS(int u,double sum)
{
if(u==des)
return sum;
for(int i=head[u];i!=-1;i=nxt[i])
if(cost[i]&&level[pnt[i]]==level[u]+1)
{
double t=DFS(pnt[i],min(sum,cost[i]));
if(t==0)
continue;
cost[i]-=t;
cost[i^1]+=t;
return t;
}
return level[u]=0;
}
void Dinic()
{
double ans=0;
while(BFS())
while(1)
{
double val=DFS(st,inf);
if(val==0)break;
ans+=val;
}
printf("%.4f\n",exp(ans));
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
e=0;
memset(head,-1,sizeof(head));
scanf("%d%d%d",&n,&m,&l);
st=0,des=n+m+1;
for(int i=1;i<=n;i++)
{
double c;
scanf("%lf",&c);
AddEdge(st,i,log(c));
}
for(int i=1;i<=m;i++)
{
double c;
scanf("%lf",&c);
AddEdge(i+n,des,log(c));
}
for(int i=1;i<=l;i++)
{
int u,v;
scanf("%d%d",&u,&v);
AddEdge(u,v+n,inf);
}
Dinic();
}
return 0;
}