| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:同求数据,附上wa代码In Reply To:求数据啊,sample过了,自己编的数据也过了,可是提交还是WA Posted by:karying at 2011-04-03 15:42:46 #include<cstdio>
#include<memory>
#define ME 310000
#define MM 110
#define MN 11000
#define min(a,b) (((a)<(b))?(a):(b))
class edge
{
public:
int to;
int pre;
int limit;
};
edge edges[ME];
int box[MN];
bool customConnect[1024][128];
int len;
int ss,ms,nks,nkc,nws,ts;
void iniPreLinkList(int m,int n)
{
int i;
len=0;
ss = 0;
ms = 0;
nks = m+ms;
nkc = nks+n;
nws = nkc+n;
ts = nws+n+1;
for(i=0;i<=ts;i++)
box[i] = -1;
memset(customConnect,false,sizeof(customConnect));
}
void printList(int m,int n)
{
int ads,i;
for(i=0;i<ts;i++)
{
printf("结点%d: ",i);
for(ads = box[i];ads!=-1;ads = edges[ads].pre)
{
printf("->(%d,%d)",edges[ads].to,edges[ads].limit);
}
printf("\n");
}
}
void addDirectedEdge(int frm,int to,int limit)
{
edges[len].pre = box[frm];
edges[len].to = to;
edges[len].limit = limit;
box[frm] = len++;
}
#define MVAL 0x7f7f7f7f
void makeGraphic(int m,int n)
{
int i,j, reserves,num,key,requir;
iniPreLinkList(m,n);
for(i=1;i<=m;i++)
{
scanf("%d",&reserves);
addDirectedEdge(ss,ms+i,reserves);
}
for(i=1;i<=n;i++)
{
scanf("%d",&num);
while(num--)
{
scanf("%d",&key);
customConnect[key][i] = true;
addDirectedEdge(ms+key,nks+i,MVAL);
for(j=1;j<MN;j++)
{
if(customConnect[key][j])
addDirectedEdge(nks+j,nkc+i,MVAL);
}
}
scanf("%d",&requir);
addDirectedEdge(nkc+i,nws+i,requir);
addDirectedEdge(nws+i,ts,MVAL);
}
}
int path[10];
int dfs(int rt,int step)
{
int ads,upd;
if(step==5)return MVAL;
for(ads=box[rt];ads!=-1;ads = edges[ads].pre)
{
//printf("step=%d搜索到%d,limit=%d\n",step,edges[ads].to,edges[ads].limit);
//getchar();
if(edges[ads].limit>0)
{
path[step] = ads;
upd = min(edges[ads].limit,dfs(edges[ads].to,step+1));
if(upd>0)
return upd;
}
}
return -1;
}
int solve(int m,int n)
{
int sum=0,upd,i,j;
do
{
upd=dfs(ss,0);
if(upd!=-1)
{
sum+=upd;
for(j=0;j<5;j++)
{
edges[path[j]].limit-=upd;
}
}
}while(upd!=-1);
return sum;
}
int main()
{
int m,n;
while(~scanf("%d%d",&m,&n))
{
makeGraphic(m,n);
//printList(m,n);
printf("%d\n",solve(m,n));
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator