http://acm.pku.edu.cn/JudgeOnline/problem?id=1161

http://acm.pku.edu.cn/JudgeOnline/images/1161_1.jpg

Код:
#include "iostream"
#include "string.h"
#define INF 100000000
using namespace std;
int main(){
	int FreeLand[201][201],        
City[251][251],            
Club[31],                  
AdjacentLand[251][201];    
	int m,n,l;
	int i,j,k,curr,first,temp,last,min,sum,place;
	cin>>m>>n>>l;
	for (i=0;i<l;i++)
cin>>Club[i];
	for (i=0;i<m;i++)
for (j=0;j<m;j++)
	if (j==i) FreeLand[i][j]=0;  
	else FreeLand[i][j]=INF;
	memset(City,0,sizeof(City));
	memset(AdjacentLand,0,sizeof(AdjacentLand));
	for (i=0;i<m;i++){
cin>>temp;
cin>>first;
last=first;
AdjacentLand[first][i]=1; 
for (j=1;j<temp;j++){
	cin>>curr;
	AdjacentLand[curr][i]=1;
	if (City[last][curr]>0) 
FreeLand[City[last][curr]-1][i]=FreeLand[i][City[last][curr]-1]=1;
	else City[last][curr]=City[curr][last]=i+1;
	last=curr;}
if (City[last][first]>0)
	FreeLand[City[last][first]-1][i]=FreeLand[i][City[first][last]-1]=1;
else City[last][first]=City[first][last]=i+1;
	}
	for (k=0;k<m;k++)  
for (i=0;i<m;i++)
	for (j=0;j<m;j++)
if (FreeLand[i][k]+FreeLand[k][j]<FreeLand[i][j])
	FreeLand[i][j]=FreeLand[i][k]+FreeLand[k][j];
	min=INF;
	for (i=0;i<m;i++){
sum=0;
for (j=0;j<l;j++){
	temp=INF;
	for (k=0;k<m;k++){
if (AdjacentLand[Club[j]][k]==0)
	continue;
if (temp>FreeLand[k][i])
	temp=FreeLand[k][i];}
	sum+=temp;}
if (min>sum){
	min=sum;
	place=i;}
	}
	cout<<min<<endl;
}