Tranvick

респа 2007 второй тур - "крестики-нолики 2007"

Nov 24th, 2011
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <cstdio>
  2. #include <queue>
  3. #include <memory.h>
  4. using namespace std;
  5. #define N 222
  6. #define M 22222
  7.  
  8. char c[N][N];
  9. int n,m,C,ef[M],es[M],ev[M],first[N],next[M],S=161,T=162,k1[N],k2[N],k[N],from[N],edge[N];
  10. bool b[N];
  11.  
  12. void _add(int x,int y,int z){
  13.     next[++C]=first[x];first[x]=C;
  14.     ef[C]=x;es[C]=y;ev[C]=z;
  15. }
  16.  
  17. int be(int x){
  18.     return (x&1)?x+1:x-1;
  19. }
  20.  
  21. void add(int x,int y,int z){
  22.     _add(x,y,z);_add(y,x,0);
  23. }
  24.  
  25. void input(){
  26.     freopen("input.txt","r",stdin);
  27.     freopen("output.txt","w",stdout);
  28.     scanf("%d %d\n",&n,&m);
  29.     for (int i=1;i<=n;i++){
  30.         for (int j=1;j<=m;j++) scanf("%c",&c[i][j]);
  31.         scanf("\n");
  32.     }
  33. }
  34.  
  35. void init(){
  36.     for (int i=1;i<=n;i++)
  37.         for (int j=1;j<=m;j++)
  38.             if (c[i][j]=='?' || c[i][j]=='-') ++k1[i];
  39.             else if (c[i][j]=='+') ++k2[i];
  40.     for (int i=1;i<=n;i++) k[i]=(k1[i]+k2[i])/2-k2[i];
  41.     for (int i=1;i<=n;i++) add(S,i,k[i]);
  42.     for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (c[i][j]=='?') add(i,80+j,1);
  43.     memset(k1,0,sizeof(k1));memset(k2,0,sizeof(k2));
  44.     for (int i=1;i<=n;i++)
  45.         for (int j=1;j<=m;j++)
  46.             if (c[i][j]=='?' || c[i][j]=='-') ++k1[j];
  47.             else if (c[i][j]=='+') ++k2[j];
  48.     for (int i=1;i<=m;i++) k[i]=(k1[i]+k2[i])/2-k2[i];
  49.     for (int i=1;i<=m;i++) add(i+80,T,k[i]);
  50. }
  51.  
  52. bool flow(){
  53.     queue<int> q;memset(b,0,sizeof(b));
  54.     b[S]=1;q.push(S);
  55.     while (!q.empty()){
  56.         int v=q.front();q.pop();
  57.         for (int h=first[v];h;h=next[h])
  58.             if (!b[es[h]] && ev[h]>=1){
  59.                 b[es[h]]=1;
  60.                 from[es[h]]=v;
  61.                 edge[es[h]]=h;
  62.                 q.push(es[h]);
  63.                 if (es[h]==T) return 1;
  64.             }
  65.     }
  66.     return 0;
  67. }
  68.  
  69. void print(){
  70.     for (int i=1;i<=C;i++)
  71.         if (ef[i]>=1 && ef[i]<=n && es[i]>80){
  72.             if (ev[i]==0) c[ef[i]][es[i]-80]='+';
  73.             else c[ef[i]][es[i]-80]='-';
  74.         }    
  75.     for (int i=1;i<=n;i++){
  76.         for (int j=1;j<=m;j++) printf("%c",c[i][j]);
  77.         printf("\n");
  78.     }
  79. }
  80.  
  81. int main(){
  82.     input();
  83.     init();
  84.     while (flow()){
  85.         int mn=1<<30;
  86.         for (int h=T;h!=S;h=from[h]) mn=min(mn,ev[edge[h]]);
  87.         for (int h=T;h!=S;h=from[h]){
  88.             ev[edge[h]]-=mn;
  89.             ev[be(edge[h])]+=mn;
  90.         }
  91.     }
  92.     print();
  93.     return 0;
  94. }
  95.  
Advertisement
Add Comment
Please, Sign In to add comment