- #include <cstdio>
- #include <cstring>
- const int MAXN = 252 ;
- const int MAX_INF = 50000 ;
- int gMember[MAXN] ;
- int region[MAXN][MAXN] ;
- bool place[MAXN][MAXN] ;
- void Floyd ( int n )
- {
- int i , j , k ;
- for ( k = 1 ; k <= n ; k++ )
- {
- for ( i = 1 ; i <= n ; i++ )
- for ( j = 1 ; j <= n ; j++ )
- {
- if ( region[i][j] > region[i][k] + region[k][j] )
- {
- region[i][j] = region[i][k] + region[k][j] ;
- }
- }
- }
- }
- int SearchPos( int m , int l )
- {
- int i , j , k , min , sum , temp ;
- min = MAX_INF ;
- for ( k = 1 ; k <= m ; k++ )
- {
- sum = 0 ;
- for ( i = 0 ; i < l ; i++ )
- {
- temp = MAX_INF ;
- for ( j = 1 ; j <= m ; j++ )
- {
- if ( place[gMember[i]][j] && temp > region[j][k] )
- {
- temp = region[j][k] ;
- }
- }
- sum += temp ;
- }
- if ( min > sum )
- {
- min = sum ;
- }
- }
- return min ;
- }
- int main()
- {
- int m , n , l , i , j , k , num , t ;
- int pos[MAXN] , temp[MAXN][MAXN] ;
- scanf("%d", &m) ;
- scanf("%d", &n) ;
- scanf("%d", &l) ;
- for ( i = 0 ; i < l ; i++ )
- {
- scanf("%d", &gMember[i]) ;
- }
- memset(temp, 0, sizeof(temp)) ;
- memset(place, 0, sizeof(place)) ;
- for ( i = 1 ; i <= m ; i++ )
- for ( j = 1 ; j <= m ; j++ )
- {
- if ( i == j )
- region[i][j] = 0 ;
- else
- region[i][j] = MAX_INF ;
- }
- for ( i = 1 ; i <= m ; i++ )
- {
- scanf("%d", &num) ;
- for ( j = 0 ; j < num ; j++ )
- {
- scanf("%d", &pos[j]) ;
- place[pos[j]][i] = true ;
- }
- for ( k = 0 ; k < num ; k++ )
- {
- j = pos[k] ;
- if ( k == num - 1 )
- {
- if ( temp[j][pos[0]] > 0 )
- {
- t = temp[j][pos[0]] ;
- region[i][t] = region[t][i] = 1 ;
- }
- else
- {
- temp[j][pos[0]] = temp[pos[0]][j] = i ;
- }
- }
- else
- {
- if ( temp[j][pos[k + 1]] > 0 )
- {
- t = temp[j][pos[k + 1]] ;
- region[i][t] = region[t][i] = 1 ;
- }
- else
- {
- temp[j][pos[k + 1]] = temp[pos[k + 1]][j] = i ;
- }
- }
- }
- }
- Floyd( m ) ;
- int ans = SearchPos( m , l ) ;
- printf("%d/n", ans) ;
- return 0 ;
- }
pku 1161 Walls
最新推荐文章于 2017-12-09 13:36:36 发布