题目地址:点击打开链接
思路:简单回溯,把所有的路找出来比较就行,数据很小,不会超时
AC代码:
#include <iostream>
#include<cstring>
using namespace std;
int map[35][35];
int visit[35];
int sum1,sum2,ncity;
void dfs(int num,int sum,int count)
{
int i;
if(sum == sum2)
{
if(count < sum1)
sum1 = count;
return;
}
for(i=1; i<ncity; i++)
{
if(visit[i])
{
visit[i] = 0;
dfs(i,sum+1,count+map[num][i]);
visit[i] = 1;
}
}
}
int main()
{
int i,j,k;
while(cin>>ncity && ncity)
{
sum1 = 1000000;//sum1每次要在函数内重置,不然会错
sum2 = 0;
memset(visit,0,sizeof(visit));
for(i=0; i<ncity; i++)
{
for(j=0; j<ncity; j++)
{
cin>>map[i][j];
}
}
cin>>k;
for(i=0; i<k; i++)
{
cin>>j;
if(!visit[j])//求出总共要走的城市
{
visit[j] = 1;
sum2++;
}
}
dfs(0,0,0);
cout<<sum1<<endl;
}
return 0;
}