标签:des style blog http io ar color os sp
和平委员会
根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立。 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍。
此委员会必须满足下列条件:
- 每个党派都在委员会中恰有1个代表,
- 如果2个代表彼此厌恶,则他们不能都属于委员会。
每个党在议会中有2个代表。代表从1编号到2n。 编号为2i-1和2i的代表属于第I个党派。
任务
写一程序:
- 从文本文件读入党派的数量和关系不友好的代表对,
- 计算决定建立和平委员会是否可能,若行,则列出委员会的成员表,
- 结果写入文本文件。
输入
在文本文件的第一个行有2非负整数n和m。 他们各自表示:党派的数量n,1 < =n < =8000和不友好的代表对m,0 <=m <=20000。 在下面m行的每行为一对整数a,b,1<=a <b<=2n,中间用单个空格隔开。 它们表示代表a,b互相厌恶。
输出
如果委员会不能创立,文本文件中应该包括单词NIE。若能够成立,文本文件SPO.OUT中应该包括n个从区间1到2n选出的整数,按升序写出,每行一个,这些数字为委员会中代表的编号。如果委员会能以多种方法形成,程序可以只写他们的某一个。
样品输入
3 2 1 3 2 4样品输出
1 4 5
#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN = 8010;
struct twosat
{
int n,c;
vector<int> g[MAXN<<1];
bool mark[MAXN<<1];
int s[MAXN<<1];
bool dfs(int x)
{
int i;
if (mark[x^1])
return 0;
if (mark[x])
return 1;
mark[x] = 1;
s[c++] = x;
for (i = 0; i < g[x].size(); i++)
if (!dfs(g[x][i]))
return 0;
return 1;
}
void init(int n)
{
int i,t=n<<1;
this->n = n;
for (i = 0; i < t; i++)
g[i].clear();
memset(mark, 0, sizeof(mark));
}
void add_clause(int x,int y)
{
g[x].push_back(y^1);
g[y].push_back(x^1);
}
bool solve()
{
int i,t=n<<1;
for (i = 0; i < t; i += 2)
if (!mark[i] && !mark[i + 1])
{
c = 0;
if (!dfs(i))
{
while (c > 0)
mark[s[--c]] =0;
if (!dfs(i + 1))
return 0;
}
}
return 1;
}
}doer;
int main()
{
int i,n,m,x,y;
while(cin>>n>>m)
{
doer.init(n);
while(m--)
{
cin>>x>>y;
doer.add_clause(x-1,y-1);
}
n<<=1;
if(doer.solve())
{
for(i=0;i<n;i++)
{
if(doer.mark[i])
cout<<i+1<<endl;
}
}
else
cout<<"NIE"<<endl;
}
return 0;
}3 2 1 3 2 4
1 4 5
标签:des style blog http io ar color os sp
原文地址:http://blog.csdn.net/stl112514/article/details/41598713