省选专练之PA2010Riddle

版权声明:LeoJAM Presents https://blog.csdn.net/fcb_x/article/details/82731865

n(1≤n≤1000000)个城市,k(1≤k≤n)个国家,m(1≤m≤1000000)条边。要求每个国家有且仅有一个首都,每条边两端的城市至少要有一个首都。判断是否有解。

额这个很明显有n^2的建边算法,即:由于每个块中只能建一个首都,开点,表示选还是不选选了A则连向所有联通块内不选的。

这里有一个优化方式:我们并不需要建造所有的不选边,可以开一个前缀和数组。

这个数组对于单个节点有四个标号分别表示

1)X点选

2)X点不选

3)X的前缀选

4)X的前缀不选

这个所谓的前缀是指按先后顺序读入的块k的前缀。

然后很明显:对于每一条边就是一个二元组

X不选-Y选

Y不选-X选

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
using namespace std;
inline void read(int &x){
	x=0;
	char ch=getchar();
	int f=1;
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	x*=f;
}
const int N=4e6+100;
struct Front_star{
	int u,v,nxt;
}e[N<<3];
int cnt=0;
int first[N];
void add(int u,int v){
	++cnt;
	e[cnt].u=u;
	e[cnt].v=v;
	e[cnt].nxt=first[u];
	first[u]=cnt;
}
int n,m,k;
//
stack<int> S;
int vis[N];
int dfn[N];
int low[N];
int tot=0;
int scc=0;
int Belong[N];
void Tarjan(int u){
	dfn[u]=low[u]=++tot;
	S.push(u);
	vis[u]=1;
	for(int i=first[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(!dfn[v]){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else{
			if(vis[v])low[u]=min(low[u],dfn[v]);
		}
	}
	if(low[u]==dfn[u]){
		int x;
		scc++;
		do{
			x=S.top();
			S.pop();
			vis[x]=0;
			Belong[x]=scc;
		}while(x!=u);
	} 
}
int main(){
//	freopen("test.in","r",stdin);
	read(n);
	read(m);
	read(k);
	for(int i=1;i<=n;++i){
		add(i,i+2*n);
		add(i+3*n,i+n);
	}
	for(int i=1;i<=m;++i){
		int u,v;
		read(u);
		read(v);
		add(u+n,v);
		add(v+n,u);
	}
	for(int i=1;i<=k;++i){
		int sum;
		read(sum);
		int Last=0;
		for(int j=1;j<=sum;++j){
			int u;
			read(u);
			if(Last){
				add(Last+2*n,u+2*n);
				add(u+3*n,Last+3*n);
				add(Last+2*n,u+n);
				add(u,Last+3*n);
			}
			Last=u;
		}
	}
	for(int i=1;i<=4*n;++i){
		if(!dfn[i])Tarjan(i);
	}
	for(int i=1;i<=n;++i){
		if(Belong[i]==Belong[i+n]||Belong[i+2*n]==Belong[i+3*n]){
			cout<<"NIE"<<'\n';
			return 0;
		}
	}
	cout<<"TAK";
}

猜你喜欢

转载自blog.csdn.net/fcb_x/article/details/82731865