poj 3308 Paratroopers
2014-02-18 14:36
204 查看
http://poj.org/problem?id=3308
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define maxn 10000
using namespace std;
const int inf=1<<30;
int n,m,l,x,y;
double c,f;
double cap[200][200],flow[200][200];
int p[200];
double a[200];
void EK(int s)
{
queue<int>q;
memset(flow,0,sizeof(flow));
f=0;
for(; ;)
{
memset(a,0,sizeof(a));
memset(p,-1,sizeof(p));
a[s]=inf;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int v=0; v<=m+n+1; v++)
{
if(!a[v]&&cap[u][v]>flow[u][v])
{
p[v]=u;
q.push(v);
a[v]=min(a[u],cap[u][v]-flow[u][v]);
}
}
}
if(a[m+n+1]==0) break;
for(int u=m+n+1; u!=0; u=p[u])
{
flow[p[u]][u]+=a[m+n+1];
flow[u][p[u]]-=a[m+n+1];
}
f+=a[m+n+1];
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(cap,0,sizeof(cap));
scanf("%d%d%d",&m,&n,&l);
for(int i=1;i<=m; i++)
{
scanf("%lf",&c);
cap[0][i]=log(c);
}
for(int i=m+1; i<=m+n; i++)
{
scanf("%lf",&c);
cap[i][m+n+1]=log(c);
}
for(int i=0; i<l; i++)
{
scanf("%d%d",&x,&y);
cap[x][m+y]=inf;
}
f=0;
EK(0);
printf("%.4f\n",exp(f));
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define maxn 10000
using namespace std;
const int inf=1<<30;
int n,m,l,x,y;
double c,f;
double cap[200][200],flow[200][200];
int p[200];
double a[200];
void EK(int s)
{
queue<int>q;
memset(flow,0,sizeof(flow));
f=0;
for(; ;)
{
memset(a,0,sizeof(a));
memset(p,-1,sizeof(p));
a[s]=inf;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int v=0; v<=m+n+1; v++)
{
if(!a[v]&&cap[u][v]>flow[u][v])
{
p[v]=u;
q.push(v);
a[v]=min(a[u],cap[u][v]-flow[u][v]);
}
}
}
if(a[m+n+1]==0) break;
for(int u=m+n+1; u!=0; u=p[u])
{
flow[p[u]][u]+=a[m+n+1];
flow[u][p[u]]-=a[m+n+1];
}
f+=a[m+n+1];
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(cap,0,sizeof(cap));
scanf("%d%d%d",&m,&n,&l);
for(int i=1;i<=m; i++)
{
scanf("%lf",&c);
cap[0][i]=log(c);
}
for(int i=m+1; i<=m+n; i++)
{
scanf("%lf",&c);
cap[i][m+n+1]=log(c);
}
for(int i=0; i<l; i++)
{
scanf("%d%d",&x,&y);
cap[x][m+y]=inf;
}
f=0;
EK(0);
printf("%.4f\n",exp(f));
}
return 0;
}
相关文章推荐
- poj 3308 Paratroopers(二分图最小点权覆盖)
- POJ 3308 Paratroopers 最小割、最大流
- POJ 3308 Paratroopers 最小点权覆盖 求最小割
- poj 3308 Paratroopers 最小割 最小点权覆盖
- poj 3308 Paratroopers 最小割—最大流
- poj 3308 Paratroopers(网络流 最小割 dinic模板)
- poj 3308 Paratroopers
- 【POJ】【3308】Paratroopers
- poj 3308 Paratroopers最小点权覆盖
- POJ 3308 Paratroopers(最小割EK(邻接表&矩阵))
- POJ 3308 Paratroopers
- POJ 3308 Paratroopers (对数转换+最小点权覆盖)
- poj3308 Paratroopers --- 最小点权覆盖->最小割
- 【最小割】POJ-3308 Paratroopers
- POJ 3308 Paratroopers
- POJ 3308 Paratroopers (最小割)
- POJ 3308 Paratroopers (最小点权覆盖Dinic)
- POJ 3308 Paratroopers (对数转换+最小点权覆盖)
- POJ 3308 Paratroopers(最小点权覆盖+dinic算法)
- (模板题)poj 3308 Paratroopers(Dinic算法最大流)