记录编号 16246 评测结果 AAAAAAAA
题目名称 软件补丁 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.020 s
提交时间 2010-04-23 14:45:43 内存使用 20.26 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int MAXN=21,MAXM=200,MAXINT=0x7fffffff;

int n,m;
int t[MAXM];
char s1[MAXM][MAXN],s2[MAXM][MAXN];
int dis[1<<(MAXN+1)];
bool in[1<<(MAXN+1)];
vector<int> v;

bool comp(int a,int b)
{return dis[a]>dis[b];}

void init()
{
	scanf("%d%d",&n,&m);	
	for(int i=0;i<m;i++)
		scanf("%d%s%s",&t[i],s1[i],s2[i]);
	for(int i=0;i<1<<n;i++)dis[i]=MAXINT;
}

int spfa()
{
	queue<int>q;
	q.push((1<<n)-1);
	in[(1<<n)-1]=true;
	dis[(1<<n)-1]=0;
	while (!q.empty())
	{
		int now=q.front();
		q.pop();
		in[now]=false;
		for(int i=0;i<m;i++)
		{
			int j;
			for(j=0;j<n;j++)
				if (s1[i][j]=='+'&&!(now>>(n-j-1)&1))
					break;
				else if (s1[i][j]=='-'&&(now>>(n-j-1)&1))
					break;
			if (j<n)continue;
			int cur=now;
			for(int j=0;j<n;j++)
				if (s2[i][j]=='+')
					cur=cur|(1<<(n-j-1));
				else if (s2[i][j]=='-'&&(now>>(n-j-1))&1)
					cur=cur^(1<<(n-j-1));
			if (dis[cur]>dis[now]+t[i])
			{
				dis[cur]=dis[now]+t[i];
				if (!in[cur])
				{
					q.push(cur);
					in[cur]=true;
				}
			}
		}
	}
	if (dis[0]==MAXINT)return -1;
	else return dis[0];
}

int main()
{
	freopen("bugs.in","r",stdin);
	freopen("bugs.out","w",stdout);
	init();
	printf("%d\n",spfa());
	return 0;
}