zoukankan      html  css  js  c++  java
  • 【BZOJ1823】[JSOI2010]满汉全席(2-sat)

    【BZOJ1823】[JSOI2010]满汉全席(2-sat)

    题面

    BZOJ
    洛谷

    题解

    很明显的(2-sat)模板题,还不需要输出方案。
    对于任意两组限制之间,检查有无同一种石材要用两种不同的方法做。如果有则连边就好了。
    具体可以看代码。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    using namespace std;
    #define ll long long
    #define MAX 1010
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    struct Line{int v,next;}e[100000];
    int h[MAX],cnt=1;
    inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
    int n,m,a[MAX][2];
    int get()
    {
    	char ch[50];scanf("%s",ch);
    	int s=n*(ch[0]=='m');
    	int x=0,l=strlen(ch);
    	for(int i=1;i<l;++i)x=x*10+ch[i]-48;
    	return x+s;
    }
    bool g[MAX][MAX];
    int dfn[MAX],low[MAX],St[MAX],top,tim,G[MAX],gr;
    bool ins[MAX];
    void init()
    {
    	memset(g,0,sizeof(g));
    	memset(h,0,sizeof(h));
    	memset(dfn,0,sizeof(dfn));
    	memset(low,0,sizeof(low));
    	memset(ins,0,sizeof(ins));
    	memset(G,0,sizeof(G));
    	cnt=1;top=tim=gr=0;
    }
    void Tarjan(int u)
    {
    	dfn[u]=low[u]=++tim;St[++top]=u;ins[u]=true;
    	for(int i=h[u];i;i=e[i].next)
    	{
    		int v=e[i].v;
    		if(!dfn[v])Tarjan(v),low[u]=min(low[u],low[v]);
    		else if(ins[v])low[u]=min(low[u],dfn[v]);
    	}
    	if(low[u]==dfn[u])
    	{
    		++gr;int v;
    		do{v=St[top--];G[v]=gr;ins[v]=false;}while(v!=u);
    	}
    }
    bool check()
    {
    	for(int i=1;i<=n;++i)
    		if(G[i]==G[i+n])return false;
    	return true;
    }
    int main()
    {
    	int T=read();
    	while(T--)
    	{
    		n=read();m=read();init();
    		for(int i=1;i<=m;++i)a[i][0]=get(),a[i][1]=get();
    		for(int i=1;i<=m;++i)
    			for(int j=i+1;j<=m;++j)
    			{
    				if(abs(a[i][0]-a[j][0])==n)g[a[i][0]][a[j][1]]=g[a[j][0]][a[i][1]]=1;
    				if(abs(a[i][0]-a[j][1])==n)g[a[i][0]][a[j][0]]=g[a[j][1]][a[i][1]]=1;
    				if(abs(a[i][1]-a[j][0])==n)g[a[i][1]][a[j][1]]=g[a[j][0]][a[i][0]]=1;
    				if(abs(a[i][1]-a[j][1])==n)g[a[i][1]][a[j][0]]=g[a[j][1]][a[i][0]]=1;
    			}
    		for(int i=1;i<=n+n;++i)
    			for(int j=1;j<=n+n;++j)
    				if(g[i][j])Add(i,j);
    		for(int i=1;i<=n+n;++i)if(!dfn[i])Tarjan(i);
    		if(check())puts("GOOD");else puts("BAD");
    	}
    }
    
  • 相关阅读:
    掌上风云
    骗子太多傻子不够用了
    关于WP7的一点想法
    诺基亚的抉择
    Windows Embedded Compact 7 试用笔记(3)
    Windows Embedded Compact 试用笔记(2)——系统定制
    重开博客
    结构体的嵌套问题
    Delphi 2010 新增功能之: IOUtils 单元(1): 初识 TDirectory.GetFiles
    TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9832026.html
Copyright © 2011-2022 走看看