All pastes #449995 Raw Edit

Anonymous

public cpp v1 · immutable
·published 2007-04-20 15:47 UTC
rendered paste body
#include <stdio.h>#include <memory.h>#include <vector>#include <algorithm>using namespace std;#define FOR(t,i,n) for(t i=0;i<n;i++)#define FIT(t,i,c) for(t::iterator i=c.begin();i!=c.end();i++)#define MAX_NODES 20//Macros for handling bit vector current#define toggle(n,key)	(key^=(1<<(n)))#define ison(n,key)	(key&(1<<(n)))//Macros for Bit Vector visited#define visit(n)	(visited[(n>>3)]|=(1<<(n&7)))#define is_visited(n)	(visited[(n>>3)]&(1<<(n&7)))typedef vector<int> _adj_list;int n;long long memo[(1<<MAX_NODES)];		//Memoized values of count_wayschar visited[(1<<MAX_NODES)>>3];	//Bit Vector Checks if a particular configuration of current					//has been visited before or not, for memoization_adj_list adj[MAX_NODES+2];		//Adjacency list represenatationlong long count_ways(int pos, unsigned long current){	int i;	long long num_ways = 0;	if(pos == n) return 1;	FIT(_adj_list,i,adj[pos])		if(!ison((*i),current)) {			toggle((*i),current);			if(!is_visited(current)) num_ways += count_ways(pos+1, current);			else num_ways += memo[current];			toggle((*i),current);		}	memo[current]=num_ways;	visit(current);	return num_ways;}inline bool less_adjacent(_adj_list a, _adj_list b){	if(a.size() < b.size()) return true;	return false;}int main(){	int _T;	scanf("%d", &_T);	while(_T--) {		int t;		unsigned long current = 0;		memset(adj, 0, sizeof(adj));		memset(memo, 0, sizeof(memo));		memset(visited, 0, sizeof(visited));		scanf("%d", &n);		FOR(int,i,n) FOR(int,j,n) {			scanf("%d", &t);			if(t==1) adj[i].push_back(j);		}		sort(adj,adj+n,less_adjacent);		printf("%lld\n", count_ways(0,current));	}	return 0;}