谁能把这四段程序连起来???
int n,k,a,b,c,s,t,f,nn,**map
int dir[4][2]
void read()
{
dir[0][0]=0; dir[0][1]=1;
dir[1][0]=1; dir[1][1]=0;
dir[2][0]=0; dir[2][1]=-1;
dir[3][0]=-1;dir[3][1]=0;
cin>>n>>a>>b>>c;
Make2Darray(map,n+1,n+1 for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>map[i][j]
}读入初始数据
constructG构造相应的网络
int num(int i,int j)
{
return((i-1)*n+j-1)*(k+2)+2;
}
void constructG(GRAPH<EDGE>&G)
{
s=0;t=1;f=1;
int i,j,d,e,cost,i1,j1,k1,k2.
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
k1=num(i,j);
for(e=1;e<=k;e++)
{
for(d=0;d<4;d++)
{
i1=i+dir[d][0];
j1=j+dir[d][1];
if(i1>0&&i1<=n&&j1>0&&j1<=n)
{
cost=(d>1)?b:0;
k2=num(i1,j1);
if(map[i][j])G.insert(new EDGE(k1+1,k2+k-1,1,cost+a));
else G.insert(new EDGE(k1-1,k2+e-1,1,cost));
}
}
}
if(!map[i][j])G.insert(new EDGE(k1,k1+k+1,1,a+c));
G.insert(new EDGE(k1+k+1,k1+k,5*(k+2),0));
}
G.insert(new EDGE(s,k+2,1,0));
k1=num(n,n);
for(e=0;e<=k;e++)G.insert(new EDGE(k1+e,t,1,0));
}
实现算法的主函数如下
int main()
{
read();
nn=n*n*(k+2)+1;
GRAPH<EDGE>G(nn,1);
constructG(G);
MINCOST<GRAPH<EDGE>,EDGE>(G,s,t,f);
output(G);
return 0;
}
output输出最小费用
void output(GRAPH<EDGE>&G)
{
int sum=0;
for(int i=2;i<=nn;i++)
{
adjlterator<EDGE>A(G,i);
for(EDGE*e=A.beg();!A.end();e=A.net())
if(e->from(i)&&e->flow()>0&&e->cost()>0)
sum+=e->cost()*e->flow();
}
cost<<sum<<endl;
}