| ||||||||||
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:和zoj1994一样的。。。为啥在poj过了在zoj就WA了In Reply To:和zoj1994一样的。。。为啥在poj过了在zoj就WA了 Posted by:zheng657555102 at 2013-07-21 15:00:34 #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <list> #include <algorithm> using namespace std; #define N 250 #define M 4444 #define INF 0x3f3f3f3f int n,m; int resflow[N][N]; int level[N]; bool isVisited[N]; int row[N],col[N]; int up[N][N],down[N][N]; int in[N],out[N]; int ST,ED; int scr,sink; bool flag; void init() { memset(resflow,0,sizeof(resflow)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(down,0,sizeof(down)); memset(up,INF,sizeof(up)); } int firstOut(int x) { for(int i=ST;i<=ED;i++) if(resflow[x][i]!=0&&level[i]==level[x]+1) return i; return -1; } int bfs() { int i; bool flag=0; queue<int> q; memset(level,INF,sizeof(level)); memset(isVisited,0,sizeof(isVisited)); q.push(scr); level[scr]=0; isVisited[scr]=true; while(!q.empty()) { int temp=q.front(); q.pop(); for(i=ST;i<=ED;i++) if(resflow[temp][i]!=0&&!isVisited[i]) { isVisited[i]=true; level[i]=level[temp]+1; q.push(i); } if(temp==sink) flag=true; } return flag; } int dinic() { int u,v,capflow,last; list<int> path; list<int>::iterator its; int maxflow=0; while(bfs()) { path.clear(); path.push_back(scr); while(firstOut(scr)!=-1) { u=path.back(); if(u!=sink) { v=firstOut(u); if(v>=0) path.push_back(v); else { path.pop_back(); level[u]=INF; } } else { capflow=INF; for(its=path.begin();its!=path.end();its++) { u=*its; if((++its)==path.end()) break; v=*its; if(resflow[u][v]<capflow) capflow=resflow[u][v]; --its; } last=-1; maxflow+=capflow; for(its=path.begin();its!=path.end();its++) { u=*its; if((++its)==path.end()) break; v=*its; resflow[u][v]-=capflow; resflow[v][u]+=capflow; if(resflow[u][v]==0&&last==-1) last=u; --its; } while(path.back()!=last) path.pop_back(); } } } return maxflow; } inline void insert(int u,int v,char ch,int val) { if(ch=='=') { if(down[u][v]>val || up[u][v]<val) flag=true; up[u][v]=down[u][v]=val; } if(ch=='<') up[u][v]=min(up[u][v],val-1); if(ch=='>') down[u][v]=max(down[u][v],val+1); if(up[u][v]<down[u][v]) flag=true; } int main() { int T,c; scanf("%d",&T); while(T--) { init(); scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) { scanf("%d",&row[i]); up[0][i]=down[0][i]=row[i]; } for(int i=1;i<=n;i++) { scanf("%d",&col[i]); up[i+m][m+n+1]=down[i+m][m+n+1]=col[i]; } scanf("%d",&c); flag=false; while(c--) { int a,b,val; char ch[3]; scanf("%d%d%s%d",&a,&b,ch,&val); if(ch[0]=='=') if(val<0) flag=true; else if(ch[0]=='>') if(val<0) val=-1; else if(ch[0]=='<') if(val<=0) flag=true; if(a==0 && b!=0) { for(int i=1;i<=m;i++) insert(i,m+b,ch[0],val); } else if(a!=0 && b==0) { for(int i=1;i<=n;i++) insert(a,m+i,ch[0],val); } else if(a==0 && b==0) { for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) insert(i,m+j,ch[0],val); } else insert(a,m+b,ch[0],val); } if(flag) { printf("IMPOSSIBLE\n"); continue; } for(int i=1;i<=m;i++) { resflow[0][i]=0; in[i]+=down[0][i]; out[0]+=down[0][i]; } for(int i=m+1;i<=m+n;i++) { resflow[i][m+n+1]=0; out[i]+=down[i][m+n+1]; in[m+n+1]+=down[i][m+n+1]; } for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { resflow[i][m+j]=up[i][m+j]-down[i][m+j]; out[i]+=down[i][m+j]; in[m+j]+=down[i][m+j]; } resflow[m+n+1][0]=INF; int sum=0; for(int i=0;i<=n+m+1;i++) { int d=in[i]-out[i]; if(d>0) { resflow[m+n+2][i]=d; sum+=d; } else resflow[i][m+n+3]=-d; } scr=m+n+2;sink=m+n+3; ST=0;ED=n+m+3; int temp=dinic(); if(sum==temp) { for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { cout<<up[i][m+j]-resflow[i][j+m]; if(j<n) cout<<" "; } cout<<endl; } } else printf("IMPOSSIBLE\n"); if(T) puts(""); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator