poj 1067

来源:互联网 发布:终南山 知乎 编辑:程序博客网 时间:2024/05/18 01:21
 

很简单的网络流 注意在后面的节点要连上一条Inf的边.. wa了几次

 

#include <cstdio>
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
const int MAXN=2000;

using namespace std;

const int inf = 0x7ffffff;

const int s = 0;
int path[MAXN][MAXN];
int spath[MAXN][MAXN];


struct edge{
       int v,next,w;
}edge[90005];

int head[2*MAXN],cnt;//for sap

void addedge(int u, int v, int w)
{
     edge[cnt].v = v;
     edge[cnt].w = w;
     edge[cnt].next = head[u];
     head[u] = cnt++;
     edge[cnt].v = u;
     edge[cnt].w = 0;
     edge[cnt].next = head[v];
     head[v] = cnt++;
}

int sap(int t)
{
    //cout<< "here" << endl;
    int pre[2*MAXN],cur[2*MAXN],dis[2*MAXN],gap[2*MAXN]; //gap标记断层
    int flow = 0 , aug = inf ,u;
    bool flag;
    for (int i = 0 ; i <= t ; ++i)
    {
        cur[i] = head[i];
        gap[i] = dis[i] = 0;
    }
    gap[s] = t+1;
    u = pre[s] = s;
    while (dis[s] <= t)
    {
          flag = 0 ;
          for (int &j = cur[u] ; ~j ; j = edge[j].next)
          {
              int v = edge[j].v;
              if (edge[j].w > 0 && dis[u] == dis[v]+1)
              {
                   flag = 1;
                   if( edge[j].w < aug )aug = edge[j].w;
                   pre[v] = u;
                   u = v;
                   if (u == t)
                   {
                       flow += aug;
                       while (u != s)
                       {
                             u = pre[u];
                             edge[cur[u]].w -= aug;
                             edge[cur[u]^1].w += aug;
                       }
                       aug = inf;
                   }
                   break;
              }
          }
          if ( flag )continue ;
          int mindis = t+1;
          for (int j = head[u]; ~j ; j = edge[j].next)
          {
              int v = edge[j].v;
              if (edge[j].w > 0 && dis[v] < mindis)
              {
                 mindis = dis[v];
                 cur[u] = j;
              }
          }
          if(--gap[dis[u]] == 0)break;
          gap[ dis[u] = mindis+1 ]++;
          u = pre[u];
    }
    return flow;
}

map <string , int > rec;

void init ()
{
    memset ( head, -1 , sizeof ( head ));
    cnt = 0 ;
}

int main()
{
    int n , m , k;
    init();
    char s1[100],s2[100];
    scanf("%d" , &n );
    for ( int i = 0 ; i < n; i ++)
    {
        scanf("%s" , s1 );
        rec[s1] = i;
        addedge ( i+101 , 301 , 1 );
    }
    scanf("%d" , &m );
    int count = 0;
    for ( int i = 0 ; i < m; i ++ )
    {
        scanf("%s %s" , s1 ,s2 );
        int loc2;
        if ( rec.find ( s2 ) == rec.end() )
        {
            rec[s2] = n+count;
            loc2 = n+count;
            count ++;
        }
        else
        {
            loc2 = rec[s2];
        }
        addedge ( i+1 , 101+loc2 , 1 );
        //cout << i+1 << "     " << 101+loc2 << endl;
        addedge ( 0 , i + 1 , 1 );
    }

    scanf("%d" ,&k );
    for ( int i = 0  ;i < k ;i ++ )
    {
        scanf("%s %s" , s1 ,s2 );
        int loc1 ,loc2;
        if ( rec.find ( s1 ) == rec.end () )
        {
            rec[s1] = n + count;
            loc1 = n + count;
            count ++;
        }
        else
        {
            loc1 = rec[s1];
        }

        if ( rec.find ( s2 ) == rec.end() )
        {
            rec[s2] = n+count;
            loc2 = n+count;
            count ++;
        }
        else
        {
            loc2 = rec[s2];
        }
        addedge ( 101+loc1 , 101+loc2 , inf );
        //addedge ( 101+loc2 , 101+loc1 , inf );
       // cout<< 101+loc1 << "    " << 101+loc2 << endl;
    }

    printf("%d\n" , m - sap ( 301 ) );
    return 0;
}

原创粉丝点击