旅行者问题

#include
#include
#include
using namespace std;
int G[20][20];
int dp[20][1<<20];
int laststate=1<<16;
int n;
void dfs(int now,int dis,int state) //现在在地方,从1到现在位置的距离,状态
{
    int i,j;
    if(now==n){
            if(state==laststate){
                dp[now][state]=min(dp[now][state],dis);
                return;
            }
    }

    if(dis>=dp[now][state]||dis>=dp[n][laststate]){  //减枝,比目前状态大的或许比最终的大的
        return ;
    }

    dp[now][state]=dis;
    for(j=2,i=2;i<=n-1;j=j<<1,i++){
        if(state&j){
            continue;
        }
        if(i==now){
            continue;
        }
        dfs(i,dis+G[now][i],state|j);
    }

    if(state==laststate^1){
        dfs(n,dis+G[now][n],state|j);
    }
    return ;
}
int main()
{

    int i,j;
        #ifndef ONLINE_JUDGE
    freopen ("in.txt", "r", stdin);
    #endif // ONLINE_JUDGE
    while(scanf("%d",&n)!=EOF){
        laststate=(1<

 

你可能感兴趣的:(acm_suibi)