设为首页 收藏本站
查看: 657|回复: 0

[经验分享] toj 1421 最大流sap

[复制链接]

尚未签到

发表于 2015-9-20 13:37:00 | 显示全部楼层 |阅读模式
/*
题意:有N家公司和N家银行,这N家公司只会向N家银行借贷,N家银行也只借贷给N家公司,被pol**e查账,查出
N家公司分别借贷了SR,N家银行分别借出了SC,交易额限制在100以下(这个地方没看到,悲剧WA);求这
样的借贷是否合理,合理则输出合法交易的矩阵。
题解:最大流;
建图:加入源点,在源点和银行之间加入有向边,权值为该银行借出的金额,银行和公司之间分别加入权值为100
的有向边,每间银行都指向所有的公司,加入汇点,在所有公司和汇点之间加入有向边,权值为公司所借的金额
数,求出最大流,然后银行和公司之间的边的权值的变化即为所求解。遍历所有边一次记录到矩阵中。
*/
#include <iostream>
#include <cstring>
using namespace std;
#define EMAX 20500
#define VMAX 250
const int INF = 0xfffffff;
int head[VMAX],dis[VMAX],cur[VMAX],gap[VMAX],pre[VMAX];
int map[VMAX][VMAX];
int EN;
struct edge
{
int from,to;
int weight;
int next;
}e[EMAX];
void insert(int u,int v,int w)
{
e[EN].from = u;
e[EN].to = v;
e[EN].weight = w;
e[EN].next = head;   
head = EN++;
e[EN].weight = 0;
e[EN].from = v;
e[EN].to = u;
e[EN].next = head[v];   
head[v] = EN++;
}
int sap(int s,int t, int n)//sap模版
{
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
for(int i=0; i<=n; i++)
cur = head;
int u = pre;
pre = s;
int ret = 0;
int temp = -1;
gap[0] = n;
bool flag;
while(dis < n)
{
flag = false;
for(int &i = cur; i != -1; i = e.next)
{
int v = e.to;
if(e.weight && dis == dis[v] + 1)
{
if (temp == -1 || temp>e.weight)
temp = e.weight;
pre[v] = u;
u = v;
if(v == t)
{
ret += temp;
for(u = pre;v != s;v = u,u = pre)
{
e[cur].weight -= temp;
e[cur^1].weight += temp;
}
temp = -1;
}
flag = true;
break;
}
}
if (flag)
continue;
int mindis = n;
for(int i = head; i != -1 ; i = e.next)
{
int v = e.to;
if(e.weight && mindis > dis[v])
{
cur = i;
mindis = dis[v];
}
}
gap[dis]--;
if( gap[dis] == 0)
break;
dis = mindis+1;
gap[dis]++;
u = pre;
}
return ret;
}
int main(void)
{
int n,t,sum;
while (cin >> n)
{
sum = 0;
memset(head,-1,sizeof(head));
memset(map,0,sizeof(map));
EN = 0;
for(int i=1; i<=n; i++)
{
cin >> t;
sum += t;
insert(0,i,t);//源点连接
        }
for(int i=1; i<=n; i++)
{
cin >> t;
insert(n+i,2*n+1,t);//汇点连接
        }
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)//公司和银行连接
insert(i,n+j,100);
if (sum == sap(0,n+n+1,n+n+2))
{
cout << "YES" << endl;
for(int u=1; u<=n; u++)//遍历所有边并且记录值
            {
for(int i=head; i!=-1; i=e.next)
{
if (e.to != 0)
{
map[e.to-n] = e[i^1].weight;
}
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if (j == 1)
cout << map[j];
else
cout << " " << map[j];
}
cout << endl;
}
}
else
cout << "NO" << endl;
}
return 0;
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-116287-1-1.html 上篇帖子: SAP BC系列标准培训教材的编号说明 下篇帖子: SAP CRM 最新简介文字(2007年、中英文)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表