- #include <stdio.h>
- #include <memory.h>
- const int MAXN = 50 ;
- const int MAX_DIST = 1000 ;
- int iDist[MAXN] ;
- bool bMap[MAXN][MAXN] , bVisit[MAXN] ;
- int iN , guardPos ;
- void dfs( int p )
- {
- int i ;
- bVisit[p] = true ;
- for ( i = 0 ; i < iN ; i++ )
- if ( i != guardPos && bMap[p][i] && !bVisit[i] )
- {
- dfs(i) ;
- }
- }
- void spfa( int iSrc )
- {
- int iQueue[MAXN], head , tail , i , u , v ;
- for ( i = 0 ; i < iN ; i++ )
- {
- iDist[i] = MAX_DIST ;
- }
- head = 0 ;
- tail = 1 ;
- iQueue[0] = iSrc ;
- iDist[iSrc] = 0 ;
- while ( head != tail )
- {
- u = iQueue[head] ;
- head = ( head + 1 ) % MAXN ;
- for ( v = 0 ; v < iN ; v++ )
- {
- if ( bMap[v][u] && iDist[u] + 1 < iDist[v] )
- {
- iDist[v] = iDist[u] + 1 ;
- iQueue[tail] = v ;
- tail = ( tail + 1 ) % MAXN ;
- }
- }
- }
- }
- int main()
- {
- int etpos , ix , iy ;
- scanf("%d %d", &iN, &etpos) ;
- memset( bMap, 0, sizeof(bMap) ) ;
- while ( scanf("%d %d", &ix, &iy) != EOF )
- {
- bMap[ix][iy] = true ;
- }
- spfa( etpos ) ; //计算出从ET所在点到其他点的最短路径
- int i , min ;
- bool bX[MAXN] = { false } ;
- while ( true )
- {
- min = MAX_DIST ;
- for ( i = 0 ; i < iN ; i++ )
- if ( i != etpos && bX[i] == false )
- {
- if ( min > iDist[i] )
- {
- guardPos = i ;
- min = iDist[i] ;
- }
- }
- if ( min == MAX_DIST )
- {
- printf("Put guards in room 0./n") ;
- break ;
- }
- memset( bVisit, 0, sizeof(bVisit) ) ;
- bX[guardPos] = true ;
- dfs(0) ;
- if ( !bVisit[etpos] ) //若无法访问到ET所在的点,则guardPos为所求监控点
- {
- printf("Put guards in room %d./n", guardPos) ;
- break ;
- }
- }
- return 0 ;
- }
pku1103
最新推荐文章于 2021-04-04 05:37:56 发布