Red problema de flujo [24] [Luogu P2761] problema parche de software

Sujeto al efecto:

Tiene una longitud \ (n \) incluye solamente la - cadena de caracteres o '+' principio todo '+', y '' \ (m \) las operaciones, cada operación tiene un tiempo de \ (C \) , que contiene sólo dos '-', '+', '0' de la cadena de caracteres \ (a \) y la cadena \ (B \) , si la cadena y la cadena \ (a \) es igual a (cadena \ (a \) posición '0' se no), entonces la cadena puede ser cambiado cadena \ (B \) (cadena \ (a \) en la posición de '0' no es), cada operación consumir \ (c \) . P. ¿Cuánto tiempo durante al menos toda la cadena en un '-'.

cuerpo:

Desde \ (n- \ Leq 20 es \) , el estado de compresión se puede utilizar, '-' y '+', respectivamente, '0' y '1' de la figura. El problema original, podemos utilizar operación de bit para determinar si la cadena original y la cadena \ (A \) es igual a:

if((u & b1[i]) == b1[i] && (u & b2[i]) == 0)

( b1[i]Y b2[i]se menciona en el texto.)

De acuerdo con la pregunta original todavía puede ser una cadena en una cadena \ (B \) :

((u | f1[i]) ^ f1[i]) | f2[i]

( f1[i]Y f2[i]también se menciona en el texto.)

Estos pueden ser obtenidos con el camino más corto para resolver este problema, he utilizado la SPFA.

código:

const int N = 110;

int n, m; 
int b1[N], b2[N], f1[N], f2[N], TiMe[N];
int dis[1 << 21];

inline void read(int &x) 
{
    char ch = getchar();
    while(ch < '0' || ch > '9')
		ch = getchar();
    x = ch - 48; ch = getchar();
    while(ch >= '0' && ch <= '9') 
	{
        x = x * 10 + (ch - 48);
        ch=getchar();
    }
}

queue <int> que;
bool vis[1 << 21];

void SPFA()
{
	memset(dis, 0x7f, sizeof dis);
	dis[(1 << n) - 1] = 0;
	que.push((1 << n) - 1);
	while (!que.empty())
	{
		int u = que.front();que.pop();
		for (int i = 1; i <= m; i++)
		{
			if((u & b1[i]) == b1[i] && (u & b2[i]) == 0)
			{
				int v = ((u | f1[i]) ^ f1[i]) | f2[i];
				if(dis[u] + TiMe[i] < dis[v])
				{
					dis[v] = dis[u] + TiMe[i];
					if(!vis[v])
					{
						que.push(v);
						vis[v] = 1;
					}
				}
			}
		}
		vis[u] = 0;
	}
}

int main()
{
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	read(n), read(m);
	for (int i = 1; i <= m; i++)
	{
		read(TiMe[i]);
	    char ch = getchar();
	    while(ch != '+' && ch != '-' && ch != '0')
			ch = getchar();
		for(int j = 1; j <= n; ++j)
		{
			if(ch == '+')
				b1[i] += 1 << (j - 1);
			if(ch == '-')
				b2[i] += 1 << (j - 1);
			ch = getchar();	
		}
	    while(ch != '+' && ch != '-' && ch != '0')
			ch = getchar();
		for(int j = 1; j <= n; ++j)
		{
			if(ch == '-')
				f1[i] += 1 << (j - 1);
			if(ch == '+')
				f2[i] += 1 << (j - 1);
			ch = getchar();	
		}
	}
	SPFA();
	if (dis[0] == dis[(1<<21)-1]) puts("0");
	else printf("%d\n", dis[0]); 
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/GJY-JURUO/p/12596048.html
Recomendado
Clasificación