poj 1087 A Plug for UNIX

#include<iostream>
#include<map>
#include<string>
#include<queue>
using namespace std;

int nReceptacle,nDevice,nType,flag,res,node;
int arr[600][600];
int pre[600];
int flow[600][600];
map<string,int> PR;
void Init()
{
int i,j;//u,v,w,
char str1[25],str2[25];
//freopen("a.txt","r",stdin);
memset(arr,0,sizeof(arr));
cin>>nReceptacle;
//flag=0;
//res=0;
node=2;
//输入Receptacle
for(i=0;i<nReceptacle;++i)
{
cin>>str1;
if(!PR[str1])
PR[str1]=node++;
arr[0][PR[str1]]++;
}

cin>>nDevice;
for(i=0;i<nDevice;++i)
{
cin>>str1>>str2;
if(!PR[str2])
PR[str2]=node++;
arr[PR[str2]][1]++;
}

cin>>nType;
for(i=0;i<nType;++i)
{
cin>>str1>>str2;
if(!PR[str1])
PR[str1]=node++;
if(!PR[str2])
PR[str2]=node++;
arr[PR[str2]][PR[str1]]=INT_MAX;
}
}

int Edmods_Karp()
{

int d[1000];//d是增广路长度,pre记录前驱
int i,j;

memset(flow,0,sizeof(flow));
while(true)
{
memset(pre,-1,sizeof(pre));
d[0]=0x7fffffff;
queue<int> que;
que.push(0);
while(!que.empty() && pre[1]<0)
{
int t=que.front();
que.pop();
for(i=0;i<node;++i)
{
if(pre[i]<0 && (j=arr[t][i]-flow[t][i]))
{
pre[i]=t;
que.push(i);
d[i]=min(d[t],j);
}
}

}
if(pre[1]<0) break;
for(i=1;i!=0;i=pre[i])
{
flow[pre[i]][i]+=d[1];
flow[i][pre[i]]-=d[1];
}
}
for(j=i=0;i<node;j+=flow[0][i++]);
return j;
}
int main()
{
Init();
int t=Edmods_Karp();
cout<<nDevice-t<<endl;
return 0;
}
原文地址:https://www.cnblogs.com/redlight/p/2429613.html