题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2421
求多源最短路,用Floyed,本题所经历的节点不确定,用排列组合(next_permutation(a,a+n))依次遍历即可。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int map[12][12];
int dist[12][12];
int a[12];
int n;
void floyed()
{
for(int k=0; k<n; k++)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
dist[i][j] = min(dist[i][j],dist[i][k] + dist[k][j]);
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(scanf(" %d",&n)!=EOF && n!=0)
{
n++;
int min = 0x3f3f3f3f;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf(" %d",&map[i][j]);
dist[i][j] = map[i][j];
}
}
floyed();
for(int i=0;i<n;i++)
{
a[i] = i;
}
do
{
int sum = 0;
for(int i=0;i<n-1;i++)
{
sum += dist[a[i]][a[i+1]];
}
sum += dist[a[n-1]][0];
if(sum<min) min = sum;
}while(next_permutation(a+1,a+n));
printf("%d\n",min);
}
return 0;
}
本题也可以用Floyed+状态压缩DP过。