荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: huhaiming (一生只爱她), 信区: Program
标 题: 1002
发信站: 荔园晨风BBS站 (Sun May 25 10:16:49 2003), 站内信件
//这题是关于最短路径和回溯搜索的
//ZOJ Monthly, May 2003 Contest 1002
//Equivalence
#include <stdio.h>
#include <string.h>
bool c[6][6],t[6][6],temp[6][6];
int n,g[6][6],b[6][6],result;
void search(int m,int p)
{
int i,j,k,x,y;
if (m==n*n){
for(i=0;i<n;i++)
for(j=0;j<n;j++)
temp[i][j]=t[i][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
if (temp[j][i]&&temp[i][k]) temp[j][k]
=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++) if (!temp[i][j]) return;
if (p<result) result=p;
}
if (p>=result) return;
x=m/n,y=m%n;
if (x==y||!c[x][y]){
search(m+1,p);
return;
}
t[x][y]=1;
search(m+1,p+g[x][y]);
t[x][y]=0;
search(m+1,p);
}
int main()
{
int i,j,k;
freopen("1002.in","r",stdin);
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
for(j=0;j<n;j++){
scanf("%d",&g[i][j]);
b[i][j]=g[i][j];
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
if (b[j][i]+b[i][k]<b[j][k]) b[j][k]
=b[j][i]+b[i][k];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if (b[i][j]!=g[i][j]) c[i][j]=0;
else c[i][j]=1;
result=0x7fffffff;
memset(t,0,sizeof(t));
for(i=0;i<n;i++) t[i][i]=1;
search(0,0);
printf("%d\n",result);
}
return 0;
}
--
菩提本无树,明镜亦非台
本来无一物,何处惹尘埃
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.200]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店