第一次写网络流的题目,虽然时间超长,但终究还是AC了,而且是一次成功,所以还是很开心。
用Edmonds-Karp 算法写的,以后再来优化了!
代码如下:
#include <iostream>
#include <queue>
using namespace std;
#define INF 0x7fffffff
#define SIZE 105
int cap[SIZE][SIZE],flow[SIZE][SIZE];
int d[SIZE],pre[SIZE],f[SIZE];
int min(int a, int b)
{
return (a>b?b:a);
}
int Edmons_Karp( int sta, int end, int len )
{
int i,j,curr,max = 0;
memset(flow,0,sizeof(flow));
while(true)
{
memset(d,0,sizeof(d));
memset(pre,0,sizeof(pre));
memset(f,0,sizeof(f));
queue<int> Q;
d[sta] = INF;
pre[sta] = sta;
f[sta] = 1;
Q.push(sta);
while (!Q.empty())
{
curr = Q.front();
Q.pop();
for ( j = 0; j <= len; j++ )
{
if ( f[j] == 0 )
{
if ( cap[curr][j] > flow[curr][j] )
{
f[j] = 1;
pre[j] = curr;
d[j] = min(d[curr],cap[curr][j]-flow[curr][j]);
Q.push(j);
}
else if ( flow[j][curr] > 0 )
{
f[j] = -1;
pre[j] = curr;
d[j] = min(d[curr],flow[j][curr]);
Q.push(j);
}
}
}
}
if (d[end] == 0) break;
for ( i = end; i != sta; i = pre[i] )
{
curr = pre[i];
if (f[i] == 1) flow[curr][i] += d[end];
else if (f[i] == -1) flow[i][curr] -= d[end];
}
max += d[end];
}
return max;
}
int main()
{
int n,np,nc,m;
int i;
int u,v,val;
while( (scanf("%d%d%d%d",&n,&np,&nc,&m)) != EOF )
{
memset(cap,0,sizeof(cap));
for ( i = 0; i < m; i++ )
{
while(cin.get() != '(');
cin >> u;
cin.ignore();
cin >> v;
cin.ignore();
cin >> val;
cap[u][v] = val;
}
for ( i = 0; i < np; i++ )
{
while(cin.get() != '(');
cin >> u;
cin.ignore();
cin >> val;
cap[n][u] = val;
}
for ( i = 0; i < nc; i++ )
{
while(cin.get() != '(');
cin >> u;
cin.ignore();
cin >> val;
cap[u][n+1] = val;
}
cout << Edmons_Karp( n, n+1, n+1 ) << endl;
}
return 0;
}
改成c输入并稍微优化之后,时间减少800ms,优化到960ms。有待进一步优化。。。
代码:
#include <iostream>
#include <queue>
using namespace std;
#define INF 0x7fffffff
#define SIZE 105
int cap[SIZE][SIZE],flow[SIZE][SIZE];
int d[SIZE],pre[SIZE];
int min(int a, int b)
{
return (a>b?b:a);
}
int Edmons_Karp( int sta, int end, int len )
{
int i,j,curr,max = 0;
memset(flow,0,sizeof(flow));
while(true)
{
memset(d,0,sizeof(d));
memset(pre,0,sizeof(pre));
queue<int> Q;
d[sta] = INF;
pre[sta] = sta;
Q.push(sta);
while (!Q.empty())
{
curr = Q.front();
Q.pop();
for ( j = 0; j <= len; j++ )
{
if ( !d[j] && cap[curr][j] > flow[curr][j] )
{
pre[j] = curr;
d[j] = min(d[curr],cap[curr][j]-flow[curr][j]);
Q.push(j);
}
}
}
if (d[end] == 0) break;
for ( i = end; i != sta; i = pre[i] )
{
curr = pre[i];
flow[curr][i] += d[end];
flow[i][curr] -= d[end];
}
max += d[end];
}
return max;
}
int main()
{
int n,np,nc,m;
int i;
int u,v,val;
while( (scanf("%d%d%d%d",&n,&np,&nc,&m)) != EOF )
{
memset(cap,0,sizeof(cap));
for ( i = 0; i < m; i++ )
{
while(cin.get() != '(');
scanf("%d",&u);
getchar();
scanf("%d",&v);
getchar();
scanf("%d",&val);
cap[u][v] = val;
}
for ( i = 0; i < np; i++ )
{
while(cin.get() != '(');
scanf("%d",&u);
getchar();
scanf("%d",&val);
cap[n][u] = val;
}
for ( i = 0; i < nc; i++ )
{
while(cin.get() != '(');
scanf("%d",&u);
getchar();
scanf("%d",&val);
cap[u][n+1] = val;
}
printf("%d\n",Edmons_Karp( n, n+1, n+1 ));
}
return 0;
}