Login / Get an account Logout
  • view
  • edit
  • history
  • discuss

template/coldwater/kosaraju

#include <bits/stdc++.h>

#define MAXN (300)
#define ui unsigned int

struct BIT{
	ui v[8];
	void clear(){ for(int i = 0; i < 8; ++ i) v[i] = 0; }
	void set(int x){       v[x >> 5] |= 1U << (x & 31); }
	void flip(int x){      v[x >> 5] ^= 1U << (x & 31); }
	int get(int x){ return v[x >> 5] >> (x & 31) & 1; }
}vis, gra[MAXN], arg[MAXN];

int n, m, k, now;
char str[MAXN];
std::stack<int> stack;

void sfd(int u){
	vis.flip(u);
	for(int i = 0; i < 8; ++ i) while(1){
		ui o = vis.v[i] & arg[u].v[i];
		if(!o) break;
		sfd(i << 5 | __builtin_ctz(o));
	}
	stack.push(u);
}

void dfs(int u){
	vis.flip(u); ++ now;
	for(int i = 0; i < 8; ++ i) while(1){
		ui o = vis.v[i] & gra[u].v[i];
		if(!o) break;
		dfs(i << 5 | __builtin_ctz(o));
	}
}

int main(){
	int test;
	scanf("%d", &test);
	while(test --){
		scanf("%d%d", &n, &m);
		for(int i = 0; i < n; ++ i) gra[i].clear(), arg[i].clear();
		for(int i = 0; i < n; ++ i){
			scanf("%s", str);
			for(int j = 0; j < n; ++ j){
				if(str[j] == '1'){
					gra[i].set(j);
					arg[j].set(i);
				}
			}
		}
		while(m --){
			scanf("%d", &k);
			while(k --){
				int u, v;
				scanf("%d%d", &u, &v);
				-- u; -- v;
				gra[u].flip(v);
				arg[v].flip(u);
			}
			
			for(int i = 0; i < n; ++ i) vis.set(i);
			for(int i = 0; i < n; ++ i) if(vis.get(i)) sfd(i);
			
			int ans = 0;
			for(int i = 0; i < n; ++ i) vis.set(i);
			while(!stack.empty()){
				int i = stack.top(); stack.pop();
				if(vis.get(i)){
					now = 0;
					dfs(i);
					ans += now * (now - 1) / 2;
				}
			}
			
			printf("%d\n", ans);
		}
	}
	return 0;
}
京ICP备17037022号
Site
  • Front page
  • All pages
  • Categories
  • Random page
  • Recent activity
  • Upload a file
  • Help
This page
  • Raw page source
  • Printable version
  • Delete this page