p1609.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 63 行

CPP
63
字号
// p1609.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#define	MAX	6

const	int	Pow [7] = { 1 , 2 , 4 , 8 , 16 , 32 , 64 };

int		N , Value;
int		graph [MAX] [MAX] , mindis [MAX] [MAX];
bool	UseIt [MAX] [MAX];
int		Contain [MAX];

void	Search ( int x , int y , int cost ) 
{
	int		i;
	bool	flag = true;
	if ( x == N ) {
		for ( i = 0; flag && i < N; i ++ ) if ( Contain [i] + 1 != Pow [N] ) flag = false;
		if ( flag && cost < Value ) Value = cost;
		return;
	}
	if ( cost >= Value ) return;

	if ( y + 1 == N ) Search ( x + 1 , 0 , cost ); else Search ( x , y + 1 , cost );
	if ( x == y || !UseIt [x] [y] || Contain [x] & Pow [y] ) return;

	int		Save [MAX];
	memcpy ( Save , Contain , sizeof ( Contain ));
	Contain [x] |= Pow [y] | Contain [y];
	for ( i = 0; i < N; i ++ ) if ( Contain [i] & Pow [x] ) Contain [i] |= Contain [x];
	
	if ( y + 1 == N ) Search ( x + 1 , 0 , cost + graph [x] [y] ); else Search ( x , y + 1 , cost + graph [x] [y] );	
	memcpy ( Contain , Save , sizeof ( Contain ));
}

int main(int argc, char* argv[])
{
	int		i , j , k;
	while ( scanf ( "%d" , &N ) != EOF ) {
		for ( i = 0;i < N; i ++ )	
			for ( j = 0; j < N; j ++ )
				scanf ( "%d" , &graph [i] [j] ) , mindis [i] [j] = graph [i] [j];

		for ( k = 0; k < N; k ++ ) 
			for ( i = 0; i < N; i ++ ) if ( i != k )
				for ( j = 0; j < N; j ++ ) if ( j != i && j != k ) 
					if ( mindis [i] [k] + mindis [k] [j] < mindis [i] [j] ) 
						mindis [i] [j] = mindis [i] [k] + mindis [k] [j];

		for ( i = 0; i < N; i ++ )
			for ( j = 0; j < N; j ++ )
				UseIt [i] [j] = mindis [i] [j] == graph [i] [j];
		Value = 0x7fffffff;
		memset ( Contain , 0 , sizeof ( Contain ));
		Search ( 0 , 0 , 0 );
		printf ( "%d\n" , Value );
	}
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?