poj 1698
2013-04-14 19:37
246 查看
网络流
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int inf=1<<30;
const int maxn=1001;
int e[maxn][maxn];
int que[maxn],test[maxn],from[maxn];
int bfs(int s,int t,int n)
{
memset(test,0,sizeof(test));
int
top=0;
que[++top]=s;
test[s]=1;
for(int
i=1;i<=top;i++)
for(int
j=1;j<=n;j++)
if(e[que[i]][j]&&test[j]==0)
{
//
printf("%d\n",top);
test[j]=1;
que[++top]=j;
from[j]=que[i];
if(j==t)
{
int ret=inf;
for(int k=t;k!=s;k=from[k])
if(ret>e[from[k]][k])
ret=e[from[k]][k];
for(int k=t;k!=s;k=from[k])
{
e[from[k]][k]-=ret;
e[k][from[k]]+=ret;
}
//
for(int k=t;from[k]!=-1;k=from[k])
//
printf("%d %d\n",from[k],k);
//
printf("%d\n",ret);
return(ret);
}
}
return(0);
}
int ek(int s,int t,int n)
{
int
ans=0;
while(1)
{
int ret=bfs(s,t,n);
if(ret==0) break;
ans+=ret;
}
//
printf("%d\n",ans);
return(ans);
}
int main()
{
//
freopen("in.txt","r",stdin);
int
tcase;
scanf("%d",&tcase);
while(tcase--)
{
memset(e,0,sizeof(e));
int film,week[50][10],big=0,sum=0;
scanf("%d",&film);
for(int k=1;k<=film;k++)
{
for(int i=1;i<=9;i++)
scanf("%d",&week[k][i]);
for(int i=1;i<=7;i++)
if(week[k][i])
for(int j=0;j<week[k][9];j++)
e[1+j*7+i+film][k+1]=1;
if(big<week[k][9]) big=week[k][9];
sum+=week[k][8];
}
for(int i=1+film+1;i<=1+film+big*7;i++)
e[1][i]=1;
for(int i=2;i<=film+1;i++)
e[i][1+film+big*7+1]=week[i-1][8];
if(sum==ek(1,1+film+big*7+1,1+film+big*7+1))
printf("Yes\n");
else
printf("No\n");
}
return
0;
}
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int inf=1<<30;
const int maxn=1001;
int e[maxn][maxn];
int que[maxn],test[maxn],from[maxn];
int bfs(int s,int t,int n)
{
memset(test,0,sizeof(test));
int
top=0;
que[++top]=s;
test[s]=1;
for(int
i=1;i<=top;i++)
for(int
j=1;j<=n;j++)
if(e[que[i]][j]&&test[j]==0)
{
//
printf("%d\n",top);
test[j]=1;
que[++top]=j;
from[j]=que[i];
if(j==t)
{
int ret=inf;
for(int k=t;k!=s;k=from[k])
if(ret>e[from[k]][k])
ret=e[from[k]][k];
for(int k=t;k!=s;k=from[k])
{
e[from[k]][k]-=ret;
e[k][from[k]]+=ret;
}
//
for(int k=t;from[k]!=-1;k=from[k])
//
printf("%d %d\n",from[k],k);
//
printf("%d\n",ret);
return(ret);
}
}
return(0);
}
int ek(int s,int t,int n)
{
int
ans=0;
while(1)
{
int ret=bfs(s,t,n);
if(ret==0) break;
ans+=ret;
}
//
printf("%d\n",ans);
return(ans);
}
int main()
{
//
freopen("in.txt","r",stdin);
int
tcase;
scanf("%d",&tcase);
while(tcase--)
{
memset(e,0,sizeof(e));
int film,week[50][10],big=0,sum=0;
scanf("%d",&film);
for(int k=1;k<=film;k++)
{
for(int i=1;i<=9;i++)
scanf("%d",&week[k][i]);
for(int i=1;i<=7;i++)
if(week[k][i])
for(int j=0;j<week[k][9];j++)
e[1+j*7+i+film][k+1]=1;
if(big<week[k][9]) big=week[k][9];
sum+=week[k][8];
}
for(int i=1+film+1;i<=1+film+big*7;i++)
e[1][i]=1;
for(int i=2;i<=film+1;i++)
e[i][1+film+big*7+1]=week[i-1][8];
if(sum==ek(1,1+film+big*7+1,1+film+big*7+1))
printf("Yes\n");
else
printf("No\n");
}
return
0;
}
相关文章推荐
- poj 3122 pie
- poj&nbsp;1308&nbsp;Is&nbsp;It&nbsp;A&nbsp;Tree?(并查集)
- poj&nbsp;3468&nbsp;A&nbsp;Simple&nbsp;Problem&nbsp;with&nbsp;I…
- poj&nbsp;1159&nbsp;Palindrome(DP&nbsp;空间压缩…
- poj&nbsp;1609&nbsp;Tiling&nbsp;Up&nbsp;Blocks(DP)
- poj 1442 Black Box
- poj 1474 Video Surveillance
- poj 1442 Black Box
- poj 1474 Video Surveillance
- 由poj&nbsp;1067引发的——取石子游…
- POJ&nbsp;1929
- poj 2015 Permutation Code
- poj 1258 简单的prim算法运用
- poj 2112 中等网络流
- POJ 3299:Humidex(水题)
- POJ 1401 Factorial (对数学知识考…
- poj 1251_kruskal
- poj_2240_bellman ford
- ACM: poj 1664
- ACM: 最长升序和最长降序 dp题 poj…