栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 2071 Technology Trader

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 2071 Technology Trader

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;const int inf=1<<30;const int nMax=1005;const int mMax=250000;class nodea{public:    int id;    nodea *p[30];    nodea(){        int i;        id=-1;        for(i=0;i<26;i++)p[i]=NULL;    }};nodea *root;int cnt;int getnum(char *s){    int i;    nodea *r=root;    int l=strlen(s);    for(i=0;i<l;i++){        if(r->p[s[i]-'A']==NULL){ r->p[s[i]-'A']=new nodea();        }        r=r->p[s[i]-'A'];    }    if(r->id==-1){        r->id=cnt;        cnt++;    }    return r->id;}class node{    public:    int c,u,v,next;};node edge[mMax];int ne, head[nMax];int cur[nMax], ps[nMax], dep[nMax],n;void addedge(int u, int v,int w){       edge[ne].u = u;    edge[ne].v = v;    edge[ne].c = w;    edge[ne].next = head[u];    head[u] = ne ++;    edge[ne].u = v;    edge[ne].v = u;    edge[ne].c = 0;    edge[ne].next = head[v];    head[v] = ne ++;}int dinic(int s, int t)      {    int tr, res = 0;    int i, j, k, f, r, top;    while(1)    {        memset(dep, -1, sizeof(dep));        for(f = dep[ps[0]=s] = 0, r = 1; f != r;) for(i = ps[f ++], j = head[i]; j; j = edge[j].next)     if(edge[j].c && dep[k=edge[j].v] == -1)     {         dep[k] = dep[i] + 1;         ps[r ++] = k;         if(k == t)         {  f = r; break;         }     }        if(dep[t] == -1) break;        memcpy(cur, head, sizeof(cur));        i = s, top = 0;        while(1)        { if(i == t) {     for(tr =inf, k = 0; k < top; k ++)         if(edge[ps[k]].c < tr)  tr = edge[ps[f=k]].c;     for(k = 0; k < top; k ++)     {         edge[ps[k]].c -= tr;         edge[ps[k]^1].c += tr;     }     i = edge[ps[top=f]].u;     res += tr; } for(j = cur[i]; cur[i]; j = cur[i] =edge[cur[i]].next) {     if(edge[j].c && dep[i]+1 == dep[edge[j].v]) break; } if(cur[i]) {     ps[top ++] = cur[i];     i = edge[cur[i]].v; } else {     if(top == 0) break;     dep[i] = -1;     i = edge[ps[-- top]].u; }        }    }    return res;}char str[nMax][100];int cost[nMax];int tag[nMax],tag1[nMax];int main(){    char ch[100];    int a,b,i,j,t,m,sum,c1,c2;    scanf("%d",&t);    while(t--){        sum=c1=c2=0;        ne=2;        cnt=1;        memset(tag,0,sizeof(tag));        memset(head,0,sizeof(head));        root=new nodea();        scanf("%d",&a);        for(i=1;i<=a;i++){ scanf("%s%d",str[i],&cost[i]); getnum(str[i]);        }        scanf("%d",&b);        for(i=1;i<=a;i++){ addedge(i,a+b+1,cost[i]);        }        for(i=a+1;i<=a+b;i++){ scanf("%s%d%d",str[i],&cost[i],&m); getnum(str[i]); sum+=cost[i]; addedge(0,i,cost[i]); while(m--){     scanf("%s",ch);     addedge(i,getnum(ch),inf); }        }        n=a+b+1;        cout<<sum-dinic(0,n)<<endl;        for(i=head[0];i;i=edge[i].next){ if(edge[i].c!=0){     tag[c1]=edge[i].v;     c1++; }        }        cout<<c1<<endl;        for(i=0;i<c1;i++){ cout<<str[tag[i]]<<endl; for(j=head[tag[i]];j;j=edge[j].next){     if(edge[j].v!=0){         tag1[c2]=edge[j].v;         c2++;     } }        }        cout<<c2<<endl;        for(i=0;i<c2;i++){ cout<<str[tag1[i]]<<endl;        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376153.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号