[最大费用最大流]HDU 5988 Coding Contest

来源:互联网 发布:java验证码识别算法 编辑:程序博客网 时间:2024/06/05 16:32

题:每个节点上有人和食物,有向边连接节点,属性包含通过人的数量上限ci,以及从第二个人开始对网络造成拥堵的概率pi。

问使每个人都获得食物的情况下, 拥堵的总概率最小是多少。


对于每个人经过的每条路,不对网络造成拥堵的概率为(1-pi),那么拥堵的总概率为1-(1-px)(1-py)(1-pk).....

求拥堵概率最小,即求(1-px)(1-py)(1-pk).....最大。将该式取对数,求ln(1-px)+ln(1-py)+ln(1-pk)即可套用最小费用最大流板子了。

最大费用建图:用权值相反数建图,求最小费用,最后求相反数即可。

注意浮点数比较用eps;

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<vector>#include<set>#include<map>#include<stack>#include<queue>using namespace std;#pragma comment(linker, "/STACK:10240000000,10240000000")#define mem(x,y) memset(x,y,sizeof(x))#define pb push_back#define bug puts("===========");#define REP(i,n) for(int i=0;i<n;i++)#define REP1(i,n) for(int i=1;i<=n;i++)#define ALL(A) A.begin(), A.end()#define T_T for(int _=RD(),test=1;test<=_;test++)typedef long long ll;typedef pair<ll ,ll> pii;#define CHG ch=getchar()#define FRD x=bo=0; for(CHG;ch<'0'||ch>'9';CHG) if(ch=='-')bo=1;#define FR2 for(;ch>='0'&&ch<='9';x=(x<<1)+(x<<3)+ch-'0',CHG);char ch; int bo;inline bool blank(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';}inline void RD(int &x){ FRD FR2 if (bo)x=-x; }inline void RD(ll &x){ FRD FR2 if (bo)x=-x; }inline ll RD(){ ll x; RD(x); return x; }inline void RD(char *s){///scanf %s    for (CHG;blank(ch);CHG);    for (;!blank(ch);CHG)*s++=ch; *s=0;}inline void RD(char &c){for(CHG;blank(c);CHG);}template<class T> inline void OT(T x){    static char buf[20];    char *p1=buf;if (!x)*p1++='0';if (x<0)putchar('-'),x=-x;    while(x)*p1++=x%10+'0',x/=10;    while(p1--!=buf)putchar(*p1);}inline void pe(){puts("");}//输出回车inline void pk(){putchar(' ');}//输出空格const double inf=1e7;const ll mod =100000007;#define pii pair<int,int>/*======================================*/const int maxn=1e3+10;const int maxe=2e5+30;const double eps=1e-8;using namespace std;int st,en;#define mytype doublestruct Edge{    int u,v,w,next;    mytype cost;}e[maxe];int ecnt,pre[maxn];void adde(int u,int v,int w,mytype cost){    e[ecnt].u=u;    e[ecnt].v=v;    e[ecnt].w=w;    e[ecnt].cost=cost;    e[ecnt].next=pre[u];    pre[u]=ecnt++;    e[ecnt].u=v;    e[ecnt].v=u;    e[ecnt].w=0;    e[ecnt].cost=-cost;    e[ecnt].next=pre[v];    pre[v]=ecnt++;}void init(int ed){    ecnt=0;    memset(pre,-1,sizeof(pre));    st=0,en=ed;}bool vis[maxn];int p[maxn];mytype dis[maxn];queue<int>que;bool spfa(){    while(!que.empty())que.pop();    memset(p,-1,sizeof(p));    memset(vis,0,sizeof(vis));    for(int i=st; i<=en; i++)    {        dis[i]=inf;    }    dis[st]=0;    vis[st]=1;    que.push(st);    while(!que.empty())    {        int u=que.front();        que.pop();        vis[u]=0;        for(int i=pre[u]; i!=-1; i=e[i].next)        {            int v=e[i].v;            if(e[i].w>0&&dis[v]-dis[u]-e[i].cost>eps)            {                dis[v]=dis[u]+e[i].cost;                p[v]=i;                if(vis[v]==0)                {                    que.push(v);                    vis[v]=1;                }            }        }    }   // printf("**%lf\n",dis[en]);    if(dis[en]==inf)        return false;    return true;}mytype MCMF(){    int flow=0;    mytype mincost=0;    int minflow;    while(spfa())    {        minflow=inf;        for(int i=p[en]; i!=-1; i=p[e[i].u])        {            minflow=min(minflow,e[i].w);        }        for(int i=p[en]; i!=-1; i=p[e[i].u])        {            e[i].w-=minflow;            e[i^1].w+=minflow;        }        flow+=minflow;        mincost+=minflow*dis[en];    }    return mincost;}int main(){    T_T{       int n,m;       RD(n),RD(m);       int ed=n+3;       init(ed);       for(int i=1;i<=n;i++){           int s,g;           RD(s),RD(g);           int k=s-g;           if(k>0)adde(0,i,k,0);           else adde(i,ed,-k,0);       }       for(int i=0;i<m;i++){           int u,v,c;           double g;           RD(u),RD(v),RD(c);           scanf("%lf",&g);           adde(u,v,1,0);           if(c-1>0)            adde(u,v,c-1,-log(1-g));       }       double k=MCMF();       k*=-1;       double ans=1-exp(k);       printf("%.2f\n",ans);    }    return 0;}



原创粉丝点击