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;

}

posted on 2011-05-29 10:45  宇宙吾心  阅读(296)  评论(0)    收藏  举报

导航