#include <stdio.h>
#include <string.h>
int const maxn = 1000;
const int INF = 0x3f3f3f3f;
int n,m,a;
int member[maxn];
int G[maxn][maxn];
struct area {
int townnum;
int town[maxn];
int vis[maxn];
}areas[maxn];
bool adj(area i, area j) {
for (int i1=0;i1<i.townnum;i1++) {
for (int j1=0;j1<j.townnum;j1++) {
if((i.town[i1]==j.town[j1]&&i.town[i1+1]==j.town[j1+1])||(i.town[i1]==j.town[j1+1]&&i.town[i1+1]==j.town[j1])) {
return true;
}
}
}
return false;
}
void floyd() {
for (int k=0;k<m;k++)
for (int i=0;i<m;i++)
for (int j=0;j<m;j++)
if(G[i][j]>G[i][k]+G[k][j])
G[i][j]=G[i][k]+G[k][j];
}
int dis(int k);
int cal() {
int ans = INF;
for (int i=0;i<m;i++) {
int temp = dis(i);
if(ans>temp) ans = temp;
}
return ans;
}
int dis(int k) {
int ans = 0 ;
for (int i=0;i<a;i++) {
int Min = INF;
for (int j=0;j<m;j++) {
if(areas[j].vis[member[i]]&&G[j][k]<Min) {
Min = G[j][k];
}
}
ans+=Min;
}
return ans;
}
int main() {
//freopen("datain.txt","r",stdin);
//freopen("dataout.txt","w",stdout);
scanf("%d%d%d",&m,&n,&a);
for (int i=0;i<a;i++) {
scanf("%d",member+i);
}
for (int i=0;i<m;i++) {
scanf("%d",&areas[i].townnum);
for (int j=0;j<areas[i].townnum;j++) {
scanf("%d",&areas[i].town[j]);
areas[i].vis[areas[i].town[j]]=1;
}
areas[i].town[areas[i].townnum]=areas[i].town[0];
}
for (int i=0;i<m;i++) {
for (int j=0;j<i;j++) {
if(adj(areas[i],areas[j])) {
G[i][j]=1;
} else G[i][j]=INF;
G[j][i]=G[i][j];
}
G[i][i] = 0;
}
floyd();
int ans = cal();
printf("%d\n",ans);
}
Poj 1161
最新推荐文章于 2020-09-04 16:55:14 发布