GYM 101149 I.It's the Police(水~)

来源:互联网 发布:单词社交网络 网盘 编辑:程序博客网 时间:2024/05/01 01:43

Description
给出一n个点的无向图,要在一些点上放警察,一个点放警察那么这个点的邻接点都会被观察到,问在保证有一个点观察不到的情况下最多能放多少警察
Input
第一行两整数n和m分别表示点数和边数,之后m行每行两整数u,v表示u和v之间有一条边,无重边(1<=n<=2e5,0<=m<=2e5)
Output
输出n个01表示第i个点是否放警察
Sample Input
5 5
1 2
2 3
3 4
4 5
5 1
Sample Output
0 0 1 1 0
Solution
找出度最小的点让它和其邻接点都不放警察即为最优
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 222222int n,m,ans[maxn];vector<int>g[maxn];int main(){    while(~scanf("%d%d",&n,&m))    {        for(int i=1;i<=n;i++)g[i].clear();        while(m--)        {            int u,v;            scanf("%d%d",&u,&v);            g[u].push_back(v),g[v].push_back(u);        }        int u=1;        for(int i=2;i<=n;i++)            if(g[i].size()<g[u].size())u=i;        for(int i=1;i<=n;i++)ans[i]=1;        ans[u]=0;        for(int i=0;i<g[u].size();i++)ans[g[u][i]]=0;        for(int i=1;i<=n;i++)printf("%d%c",ans[i],i==n?'\n':' ');    }    return 0;}
0 0