Problema - UVa 11550 - Demanding Dilemma

Resolví este problema y me generó una gran duda ya que obtuve AC luego de hacer un cambio que consideraba innecesario.
El código que obtuvo AC hacía esto por cada testcase:

Código AC
void solve(){
	int n,m;
	cin>>n>>m;
	
	int matrix[m][n];
	forn(i,n) forn(j,m) cin>>matrix[j][i];
	
	set<pair<int,int>> edges;
	forn(i,m){
		int u = -1, v = -1;
		forn(j,n){
			if(!matrix[i][j]) continue;
			if(u == -1) u = j;
			else if(v == -1) v = j;
			else{
				cout<<"No\n";
				return;
			}
		}
		if(u == -1 || v == -1){
			cout<<"No\n";
			return;
		}
		if(edges.count({v,u})){
			cout<<"No\n";
			return;
		}
		edges.insert({u,v});
		edges.insert({v,u});
	}
	cout<<"Yes\n";
}

Como los nodos candidatos a conectar se recorren en orden de 0 a n-1 pensé que no haría falta insertarla en ambos sentidos. Sin embargo, este código obtuvo WA.

Código WA
void solve(){
	int n,m;
	cin>>n>>m;
	
	int matrix[m][n];
	forn(i,n) forn(j,m) cin>>matrix[j][i];
	
	set<pair<int,int>> edges;
	forn(i,m){
		int u = -1, v = -1;
		forn(j,n){
			if(!matrix[i][j]) continue;
			if(u == -1) u = j;
			else if(v == -1) v = j;
			else{
				cout<<"No\n";
				return;
			}
		}
		if(edges.count({u,v})){
			cout<<"No\n";
			return;
		}
		if(v == -1){
			cout<<"No\n";
			return;
		}
		edges.insert({u,v});
	}
	cout<<"Yes\n";
}

Cuestión que me no quiero quedarme con la duda y quisiera saber si alguien puede darme una respuesta. Capaz me estoy olvidando algún detalle y no lo estoy viendo :cold_face:.
¡¡¡Muchas gracias :sparkles:!!!

1 me gusta

Parece bastante raro! Sobre un caso válido creo que deberían dar siempre lo mismo ambas versiones, ¿quizás significa que algún input es inválido?

Falta el resto del código que llama a solve como para descartar que haya algo peculiar en la forma exacta en que se llama. Algo que se me ocurre es que si hay tokens de menos en el input quizás se induce algún undefined behaviour, pero bueno se supone que no debería pasar… Yo llenaría de asserts de cosas imposibles a ver si agregar alguno genera runtime error, como para debuguear el asunto.

1 me gusta

Dude si volver para responder acá porque no sabía que tanto iba a aportar. Finalmente volví para darle un cierre, aunque sea.

Hice lo de agregarle asserts a la versión WA en algunas partecitas a ver si agarraba algún runtime error. Cuando lo mandé dio AC :face_with_raised_eyebrow:. Mágicamente anduvo, incluso luego le saqué los asserts y mandé de nuevo y también daba AC xD.

No sé si vale la pena seguir averiguando las razones porque no es la primera vez que tengo una experiencia rara con el UVa OJ, aunque ninguna tan rara como esta.

1 me gusta