POJ3436
来源:互联网 发布:学吉他的软件 编辑:程序博客网 时间:2024/06/14 08:00
这是第二道网络流。。=。=我是有多落后。。这题完全是看的别人的思路,照着别人的代码敲的。感觉这样的拆点方式很是巧妙,是按机器的流入流出进行拆点。分为两个点。然后再进行连接。开始的时候一直WA。是因为没有将为2的机器某点与源点相连。也没有将其与汇点相连。只是感受到了网络流的一点点美很是爽~~而且深刻到认识到我的EK模板的内部的工作方式~~
上代码:
#include<cstdio>
#include<cstring>
using namespace std;
struct node{
int w,s[15],e[15];
};
node a[60];
int c[200][200],n,m;
int g[200][200];
const int inf=1000000000;
int Edmonds_Karp( int s, int t ){
int p, q, queue[210], u, v, pre[210], flow= 0, aug;
while(true){
memset(pre,-1,sizeof(pre));
for( queue[p=q=0]=s; p<=q; p++ ){
u= queue[p];
for( v=0; v<m&&pre[t]<0; v++ )
if( c[u][v]>0 && pre[v]<0 )
pre[v]=u, queue[++q]=v;
if( pre[t]>=0 ) break;
}
if( pre[t]<0 ) break;
aug= 99999999;
for( u=pre[v=t]; v!=s; v=u,u=pre[u] )
if(c[u][v]<aug) aug=c[u][v];
for( u=pre[v=t]; v!=s; v=u,u=pre[u] )
c[u][v]-=aug, c[v][u]+=aug;
flow+= aug;
}
return flow;
}
main(){
int p,i,j,k,edge,f;
while(scanf("%d%d",&p,&n)!=-1){
//printf("wa\n");
edge=0;
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
scanf("%d",&a[i].w);
c[i][i+n]=a[i].w;
edge++;
for(j=1;j<=p;j++){
scanf("%d",&a[i].s[j]);
}
for(j=1;j<=p;j++){
scanf("%d",&a[i].e[j]);
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i==j)
continue;
int flag=1;
for(k=1;k<=p;k++)
if(a[i].e[k]!=a[j].s[k] && a[j].s[k]!=2){
flag=0;
break;
}
if(flag==1){
edge++;
c[i+n][j]=inf;
}
}
}
for(i=1;i<=n;i++){
int num1=0,num2=0;
for(j=1;j<=p;j++){
if(a[i].s[j]==0 || a[i].s[j]==2)
num1++;
if(a[i].e[j]==1 || a[i].e[j]==2)
num2++;
}
if(num1==p){
c[0][i]=inf;
edge++;
}
if(num2==p){
c[i+n][2*n+1]=inf;
edge++;
}
}
for(i=0;i<=2*n+1;i++){
for(j=0;j<=2*n+1;j++){
g[i][j]=c[i][j];
//printf("%d ",c[i][j]);
}
//printf("\n");
}
m=2*n+2;
n=edge;
//printf("%d %d\n",n,m);
f=Edmonds_Karp(0,m-1);
//for(i=0;i<=m-1;i++){
//for(j=0;j<=m-1;j++){
//printf("%d ",c[i][j]);
//}
//printf("\n");
//}
edge=0;
for(i=(m-2)/2+1;i<=m-2;i++){
for(j=1;j<=(m-2)/2;j++){
if((i-(m-2)/2)!=j &&c[i][j]<g[i][j])
edge++;
}
}
printf("%d %d\n",f,edge);
for(i=(m-2)/2+1;i<=m-2;i++){
for(j=1;j<=(m-2)/2;j++){
if((i-(m-2)/2)!=j && g[i][j]>c[i][j])
printf("%d %d %d\n",i-(m-2)/2,j,g[i][j]-c[i][j]);
}
}
}
- POJ3436
- POJ3436
- POJ3436
- poj3436
- poj3436
- poj3436
- poj3436 ACM Computer Factory
- poj3436-ACM Computer Factory
- POJ3436 ACM Computer Factory
- 【网络流】poj3436
- POJ3436解题思路
- POJ3436 ACM Computer Factory
- poj3436 ACM Computer Factory
- poj3436+最大流
- poj3436--网络流
- poj3436 ACM Computer Factory
- POJ3436-ACM Computer Factory
- POJ3436(最大流)
- C++ Primer Plus学习:第十二章 类和动态内存(1)
- 如何提取网页中的视频
- Use WLST offline to update a Weblogic domain
- HDU 倒数第二小
- 课堂笔记--JDBC 事务控制和管理
- POJ3436
- 华为2012校园招聘上机编程题(3)
- 我混不了了
- C,C++表达式求值顺序
- LinearLayout layout_gravity
- 事务
- JDBC批量处理
- i++ : 顺序点(sequence point) 与 副作用 (side effect)
- EF Update Entity