poj 3311
#include<iostream>
#include<fstream>
using namespace std;
int n;
int map[14][14];
int a[14];
int ans;
void solve(int s,int t){
int i,j,k;
if(ans!=-1&&t>ans) return;
if(s==n)
{
if(ans==-1) ans=t+map[a[s]][0];
else
ans=min(ans,t+map[a[s]][0]);
return;
}
for(i=s+1;i<=n;i++)
{
swap(a[s+1],a[i]);
solve(s+1,t+map[a[s]][a[s+1]]);
swap(a[s+1],a[i]);
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
while(cin>>n)
{
if(n==0) return ;
ans=-1;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
cin>>map[i][j];
for(k=0;k<=n;k++)
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
for(i=0;i<=n;i++)
a[i]=i;
solve(0,0);
cout<<ans<<endl;
}
}
int main(){
read();
return 0;
}
#include<fstream>
using namespace std;
int n;
int map[14][14];
int a[14];
int ans;
void solve(int s,int t){
int i,j,k;
if(ans!=-1&&t>ans) return;
if(s==n)
{
if(ans==-1) ans=t+map[a[s]][0];
else
ans=min(ans,t+map[a[s]][0]);
return;
}
for(i=s+1;i<=n;i++)
{
swap(a[s+1],a[i]);
solve(s+1,t+map[a[s]][a[s+1]]);
swap(a[s+1],a[i]);
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
while(cin>>n)
{
if(n==0) return ;
ans=-1;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
cin>>map[i][j];
for(k=0;k<=n;k++)
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
for(i=0;i<=n;i++)
a[i]=i;
solve(0,0);
cout<<ans<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号