ID:45838
Title:FindWires4a
Author:Claus Still
Date:2008-05-01 11:56:15
Score:18313.7331
Result:178520.00 (cyc: 33, node: 1226)
CPU Time:80.8192
Status:Passed
Comments:
Based on:none
Code:
function W = solver(B)
[m,n]=size(B);
pins=sort(unique(B));
pins(1)=[];
numpins=length(pins);
for i=1:numpins
  hscore(i)=sum(sum(B==pins(i)))*pins(i);
end
[tmp,si]=sort(-hscore);
pins=pins(si);
hB=[ones(1,n+2)*999999;ones(m,1)*999999 B ones(m,1)*999999;ones(1,n+2)*999999];
W=zeros(0,4);
  [hW,hB]=connectpins2(hB,pins,m,n,B);
  W=[W;hW];
W=W-1;

function [path,hB]=connectpins2(hB,pins,m,n,B)
numpins=length(pins);
for i=1:numpins
  ucpins{i}=find(hB==pins(i)); 
  cpins{i}=[ucpins{i}(1)]; 
  ucpins{i}(1)=[];
end
path=zeros(0,4);
hm=m+2;
hn=n+2;
while (1)
  bestplen=999999;
  bestcost=999999;
  bestucj=0;
  bestii=0;
  for ii=1:numpins
    numuc=length(ucpins{ii});
    numc=length(cpins{ii});
    for i=1:numc
      for j=1:numuc
        [hlen,hipath,hcost]=findshortestpathcost(hB,cpins{ii}(i),ucpins{ii}(j),m,n);
        if ( hcost<bestcost )
          bestplen=hlen;
          bestipath=hipath;
          bestucj=j;
          bestii=ii;
          bestcost=hcost;
        end
      end
    end
  end
  if ( bestucj>0 && bestcost<pins(bestii) )
    for i=1:length(bestipath)-1
      [r1,c1]=ind2sub([hm,hn],bestipath(i));
      [r2,c2]=ind2sub([hm,hn],bestipath(i+1));
      path=[path;r1 c1 r2 c2];
    end
    for i=2:length(bestipath)-1
      if ( hB(bestipath(i))==-1 )
        [r1,c1]=ind2sub([hm,hn],bestipath(i)); 
        path=[path;r1 c1 r1 c1];
      end      
      hB(bestipath(i))=-1;
    end
    cpins{bestii}=[cpins{bestii};ucpins{bestii}(bestucj)];
    ucpins{bestii}(bestucj)=[];
  else
    fok=0;
    for jj=1:numpins
      if ( length(cpins{jj})==1 && length(ucpins{jj})>1 )
        cpins{jj}(1)=ucpins{jj}(1);
        ucpins{jj}(1)=[];
        fok=1;
      end
    end
    if ( ~fok )
      return
    end
  end
end

function [len,ipath,cost]=findshortestpathcost(hB,startpin,endpin,m,n)
uv=zeros(4*m*n,1); 
uvi=1; 
huvi=1; 
uv(1)=startpin;
threshold=hB(startpin);
hm=m+2; hn=n+2;
hBC=hB; 
hBC(hBC>0)=-2;
hBC(startpin)=0;
hBC(endpin)=0;
hB(hB>0)=999999;
hB(startpin)=startpin;
hB(endpin)=0;
while ( ~hB(endpin) && uvi<=huvi )
  hpin=uv(uvi)-1;
  hpin2=uv(uvi)-2;
  hcost=hBC(uv(uvi))+1;
  if ( hB(hpin)==-1 )
    hcost=hcost+26;
  end
  if ( hcost<threshold )
    if ( ~hBC(hpin) || (hBC(hpin)>0 && hcost<hBC(hpin)) )
      hB(hpin)=uv(uvi);
      hBC(hpin)=hcost;
      huvi=huvi+1;
      uv(huvi)=hpin;
    elseif ( hB(hpin)==-1 && hB(hpin2)==0 )
      hB(hpin)=uv(uvi);
      hB(hpin2)=hpin;
      hBC(hpin2)=hcost;
      huvi=huvi+1;
      uv(huvi)=hpin2;
    end
  end
  hpin=uv(uvi)+1;
  hpin2=uv(uvi)+2;
  hcost=hBC(uv(uvi))+1;
  if ( hB(hpin)==-1 )
    hcost=hcost+26;
  end
  if ( hcost<threshold )
    if ( ~hBC(hpin) || (hBC(hpin)>0 && hcost<hBC(hpin)) )
      hB(hpin)=uv(uvi);
      hBC(hpin)=hcost;
      huvi=huvi+1;
      uv(huvi)=hpin;
    elseif ( hB(hpin)==-1 && hB(hpin2)==0 )
      hB(hpin)=uv(uvi);
      hB(hpin2)=hpin;
      hBC(hpin2)=hcost;
      huvi=huvi+1;
      uv(huvi)=hpin2;
    end
  end
  hpin=uv(uvi)+hm;
  hpin2=uv(uvi)+2*hm;
  hcost=hBC(uv(uvi))+1;
  if ( hB(hpin)==-1 )
    hcost=hcost+26;
  end
  if ( hcost<threshold )
    if ( ~hBC(hpin) || (hBC(hpin)>0 && hcost<hBC(hpin)) )
      hB(hpin)=uv(uvi);
      hBC(hpin)=hcost;
      huvi=huvi+1;
      uv(huvi)=hpin;
    elseif ( hB(hpin)==-1 && hB(hpin2)==0 )
      hB(hpin)=uv(uvi);
      hB(hpin2)=hpin;
      hBC(hpin2)=hcost;
      huvi=huvi+1;
      uv(huvi)=hpin2;
    end
  end
  hpin=uv(uvi)-hm;
  hpin2=uv(uvi)-2*hm;
  hcost=hBC(uv(uvi))+1;
  if ( hB(hpin)==-1 )
    hcost=hcost+26;
  end
  if ( hcost<threshold )
    if ( ~hBC(hpin) || (hBC(hpin)>0 && hcost<hBC(hpin)) )
      hB(hpin)=uv(uvi);
      hBC(hpin)=hcost;
      huvi=huvi+1;
      uv(huvi)=hpin;
    elseif ( hB(hpin)==-1 && hB(hpin2)==0 )
      hB(hpin)=uv(uvi);
      hB(hpin2)=hpin;
      hBC(hpin2)=hcost;
      huvi=huvi+1;
      uv(huvi)=hpin2;
    end
  end
  uvi=uvi+1;
end
len=0;
ipath=[];
if ( ~hB(endpin) )
  len=999999; 
  cost=999999;
  return;
end
cost=hBC(endpin);
while ( endpin ~= startpin )
  ipath=[ipath;endpin];
  endpin=hB(endpin);
  len=len+1;
end
ipath=[ipath;endpin];