poj1161

floyd

大约是n^3的效率,32ms

View Code
#include <iostream>
#include
<cstdio>
#include
<cstdlib>
#include
<cstring>
using namespace std;

#define maxl 35
#define maxn 205
#define maxm 300

int m, n, l;
int member[maxl];
int dist[maxn][maxn];
int wall[maxm][maxm];
int map[maxm][maxn];

void floyd()
{
for (int i = 0; i < n; i++)
dist[i][i]
= 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (dist[j][i] != -1)
for (int k = 0; k < n; k++)
if (dist[i][k] != -1 && (dist[j][k] == -1 || dist[j][k] > dist[j][i] + dist[i][k]))
dist[j][k]
= dist[j][i] + dist[i][k];
}

int main()
{
//freopen("t.txt", "r", stdin);
scanf("%d%d%d", &n, &m, &l);
for (int i = 0; i < l; i++)
scanf(
"%d", &member[i]);
memset(dist,
-1, sizeof(dist));
memset(wall,
-1, sizeof(wall));
for (int i = 0; i < n; i++)
{
int a;
scanf(
"%d", &a);
int first, last, now;
scanf(
"%d%d", &first, &last);
if (wall[first][last] != -1)
dist[i][wall[first][last]]
= dist[wall[first][last]][i] = 1;
else
wall[first][last]
= wall[last][first] = i;
map[first][i]
= true;
map[last][i]
= true;
for (int j = 2; j < a; j++)
{
scanf(
"%d", &now);
if (wall[now][last] != -1)
dist[i][wall[now][last]]
= dist[wall[now][last]][i] = 1;
else
wall[now][last]
= wall[last][now] = i;
last
= now;
map[now][i]
= true;
}
if (wall[first][last] != -1)
dist[i][wall[first][last]]
= dist[wall[first][last]][i] = 1;
else
wall[first][last]
= wall[last][first] = i;
}
floyd();
int ans = 0x3f3f3f3f;
for (int i = 0; i < n; i++)
{
int sum = 0;
for (int j = 0; j < l; j++)
{
int x = 0x3f3f3f3f;
for (int k = 0; k < n; k++)
if (map[member[j]][k])
x
= min(x, dist[k][i]);
sum
+= x;
}
ans
= min(ans, sum);
}
printf(
"%d\n", ans);
return 0;
}

你可能感兴趣的:(poj)