poj2106,POJ 2584 T-Shirt Gumbo 構圖 最大流

 2023-11-18 阅读 24 评论 0

摘要:題意:acmer比賽穿的T-shirt 有 S M L X T五種型號,每個人穿的型號介于給出的兩字母之間,五種 T-shirt 每種都有一定的數量, 問是否每個人都可以得到自己需要的型號 ? 這個題。。。不評價。。。開始構圖構錯了,本想增加一個源點m,增

題意:acmer比賽穿的T-shirt 有 S M L X T五種型號,每個人穿的型號介于給出的兩字母之間,五種 T-shirt 每種都有一定的數量,

問是否每個人都可以得到自己需要的型號

?

這個題。。。不評價。。。開始構圖構錯了,本想增加一個源點m,增加一個匯點,中間只要 T-shirt的5個點,如果有隊員需要某種

?

poj2106、?

T-shirt,該點與源點的連線就+1。某種T-shirt數量有多少,就把該點與匯點連線,權值為該T-shirt的數量,結果WA,好好考慮也是,

?

?

不畫出錯誤的圖了。 正確的思路,把人和T-shirt 都看成點,人和源點連線,權值為1,該隊員再和需要的T-shirt 連線,權值為1,然后

?

圓形構圖特點、?

T-shirt再與匯點連線,權值為數量。。。

?

?

代碼:

?

s型構圖特點。? ? ? ?

//雖然點不多,由于構圖原因,不能用矩陣map
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
#define inf 1<<30
#define mMAX 300
#define nMAX 30
#define Min(a,b)a<b?a:b
using namespace std;
int level[nMAX],head[nMAX];
int n,t,s_edge;
int a[100];
struct Edge
{int to,w,next;
} edge[mMAX];void addedge(int u,int v,int W)
{s_edge++;edge[s_edge].to=v;edge[s_edge].w=W;edge[s_edge].next=head[u];head[u]=s_edge;s_edge++;edge[s_edge].to=u;edge[s_edge].w=0;edge[s_edge].next=head[v];head[v]=s_edge;return ;
}int dfs(int x,int cap)
{if(x==t)return cap;int temp=cap;for(int e=head[x];e;e=edge[e].next){int To=edge[e].to;if(level[To]==level[x]+1&&temp>0&&edge[e].w>0){int tt=dfs(To,Min(temp,edge[e].w));edge[e].w-=tt;edge[e^1].w+=tt;temp-=tt;}}return cap-temp;
}bool bfs()
{queue<int>qu;memset(level,-1,sizeof(level));level[0]=0;qu.push(0);while(!qu.empty()){int tt=qu.front();qu.pop();for(int e=head[tt];e;e=edge[e].next){int To=edge[e].to;if(level[To]==-1&&edge[e].w>0){level[To]=level[tt]+1;qu.push(To);}}}if(level[t]!=-1)return 1;return 0;
}int dinic()
{int SUM=0;while(bfs()){SUM+=dfs(0,inf);}return SUM;
}void init()//由于慣性,開始寫的 ch2[0]-64,意思就是從A開始,太機械了!         
{a['S']=1;a['M']=2;a['L']=3;a['X']=4;a['T']=5;return ;
}int main()
{init();char ch1[20],ch2[3];int i,j;while(~scanf("%s",ch1)){if(!strcmp(ch1,"ENDOFINPUT"))break;memset(head,0,sizeof(head));s_edge=1;scanf("%d",&n);t=n+6;for(i=1;i<=n;i++){addedge(0,i,1);scanf("%s",ch2);int m1=ch2[0],m2=ch2[1];for(j=a[m1];j<=a[m2];j++)addedge(i,j+n,1);}int num=0;for(i=1;i<=5;i++){scanf("%d",&j);addedge(i+n,t,j);num+=j;//開始寫的num++,暈死,不來動腦子的}scanf("%s",ch1);if(num<n)//剪枝printf("I'd rather not wear a shirt anyway...\n");else{num=dinic();if(num<n)printf("I'd rather not wear a shirt anyway...\n");else printf("T-shirts rock!\n");}}return 0;
}

  

  

轉載于:https://www.cnblogs.com/sdau10kuaile/archive/2012/02/19/2357816.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/175780.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息