| ||||||||||
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