(最小费用流)BZOJ-2542: [Ctsc2001]终极情报网

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2542

用类似最小费用增广路的方法去查找增广路就行啦~

代码(很丑勿喷):

/**************************************************************

    Problem: 2542

    User: *****

    Language: C++

    Result: Accepted

    Time:140 ms

    Memory:2468 kb

****************************************************************/

 

#include <algorithm>

#include <cstring>

#include <queue>

#include <cstdio>

#include <vector>

 

using namespace std;

 

#define MAXN 500

 

const double detail=0.999999999999;

 

int n,k;

 

double as[MAXN];

int am[MAXN];

 

struct node {

    int t,v;

    double c;

    node *next,*next0;

};

 

node *map[MAXN][MAXN];

node *head[MAXN];

 

int Insert(int s,int t,int f,double c){

    if (map[s][t]==NULL){

        node *p=new(node);

        (*p).t=t;

        (*p).c=c;

        (*p).v=f;

        (*p).next0=NULL;

        (*p).next=head[s];

        head[s]=p;

        map[s][t]=p;

    } else {

        node *p=map[s][t];

        while (p!=NULL){

            if ((*p).c==c){

                (*p).v+=f;

                return 0;

            }

            p=(*p).next0;

        }

        p=new(node);

        (*p).t=t;

        (*p).v=f;

        (*p).c=c;

        (*p).next=head[s];

        head[s]=p;

        (*p).next0=map[s][t];

        map[s][t]=p;

    }

    return 0;

}

 

double dist[MAXN],minc[MAXN];

int suff[MAXN],minf[MAXN];

bool f[MAXN];

int max_flow=0;

 

struct cmp{

    bool operator()(int x, int y){

        return dist[x]<dist[y];

    }

};

 

priority_queue<int,vector<int>,cmp>qu;

 

double EXP(double x,int y){

    if (y==1) return x;

    return EXP(x,y/2)*EXP(x,y-(y/2));

}

 

double minimum_cost_flow(int s,int t){

    double rec=1;

    while (1){

        memset(dist,0,sizeof(dist));

        memset(f,false,sizeof(f));

        f[s]=true;

        dist[s]=1;

        suff[s]=0;

        minf[s]=0x7fffffff;

        qu.push(s);

        while (!qu.empty()){

            int u=qu.top();

            qu.pop();

            if (f[u]){

                f[u]=false;

                node *p=head[u];

                while (p!=NULL){

                    if ((*p).v>0&&dist[u]*(*p).c>dist[(*p).t]){

                        dist[(*p).t]=dist[u]*(*p).c;

                        suff[(*p).t]=u;

                        f[(*p).t]=true;

                        qu.push((*p).t);

                        minf[(*p).t]=min(minf[u],(*p).v);

                        minc[(*p).t]=(*p).c;

                    }

                    p=(*p).next;

                }

            }

        }

        if (dist[t]){

            max_flow+=minf[t];

            int i=t;

            while (suff[i]){

                rec*=EXP(minc[i],minf[t]);

                Insert(suff[i],i,-minf[t],minc[i]);

                Insert(i,suff[i],minf[t],double(1)/double(minc[i])*detail);

                i=suff[i];

            }

        } else break;

    }

    return rec;

}

 

void output_double(double x,int y){

    int i=0,l=0;

    int ans[15];

    ans[0]=0;

    while (1){

        x*=10;

        int z=int(x);

        x-=int(x);

        ans[++l]=z;

        if (z||i) i++;

        if (i>=y+1) break;

    }

    if (ans[l]>=5) ans[l-1]++;

    int j=l-1;

    while (ans[j]>=10) {

        ans[j-1]+=ans[j]/10;

        ans[j]%=10;

        j--;

    }

    printf("%d.",ans[0]);

    for (int i=0;i++<l-1;) printf("%d",ans[i]);

    printf("\n");

}

 

int main(){

    scanf("%d%d",&n,&k);

    for (int i=0;i<MAXN;i++){

        head[i]=NULL;

        for (int j=0;j<MAXN;j++){

            map[i][j]=NULL;

        }

    }

    for (int i=0;i++<n;) {

        scanf("%lf",&as[i]);

    }

    for (int i=0;i++<n;) {

        scanf("%d",&am[i]);

        if (am[i]){

            Insert(n+1,i,am[i],as[i]);

        }

    }

    for (int i=0;i++<n;){

        int x;

        scanf("%d",&x);

        if (x){

            Insert(i,n+2,0x7fffffff,1);

        }

    }

    while (1){

        int x,y,m;

        double s;

        scanf("%d%d",&x,&y);

        if (x==-1&&y==-1) break;

        scanf("%lf%d",&s,&m);

        Insert(x,y,m,s);

        Insert(y,x,m,s);

    }

    Insert(n+3,n+1,k,1);

    double ans=minimum_cost_flow(n+3,n+2);

    if (max_flow<k) printf("0\n");

    else output_double(ans,5);

    return 0;

}


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 相信每一位玩ACM程序设计竞赛的同学来说,都有一个从入门到精通的过程,而且分享他们经验的时候,见到最多的就是一种合...
    FinlayLiu阅读 5,369评论 6 182
  • 什么时候能和你一道 去看激荡人心的长风与排浪 什么时候能和你一起 去森林采摘芬芳的野蘑菇 捧起那绿茸茸的阳光 什么...
    冰露雨萱阅读 219评论 0 0
  • 田畴沃野间 有一个人 世人亲切地唤他为“农民” 群山是他的脊梁 耕牛是他的伴侣 深深的犁沟印着他岁月的痕...
    16878147c752阅读 436评论 0 0
  • 她是个特别懂事的孩子 打小别人就这么夸她 打小她也就以为 懂事,是件光荣的事 可是,当她和妹妹抢东西的时候,因为懂...
    zzzzzy_9131阅读 228评论 0 3
  • 提起大鹏,大家可能第一想到的就是《屌丝男士》,不过确实也是这部剧让大鹏走进大家的视野,但同时也给大鹏打上了屌丝的标...
    侃侃网剧阅读 208评论 0 0