码迷,mamicode.com
首页 > 其他好文 > 详细

P1330 封锁阳光大学

时间:2019-09-30 14:54:32      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:node   直接   ==   string   main   eof   min   possible   输出   

题面:https://www.luogu.org/problem/P1330

本题直接将相邻点染成不同的颜色,遇到染不了的就输出Impossible
然后每次统计染色点数少的加起来就行了.

Code:
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=500005;
int n,m,cnt,head[N],ans,sum0,sum1;
int col[N];
bool flag=true,vis[N];
struct Node{
    int v,nxt;
}edge[N];
void add(int u,int v){
    ++cnt;
    edge[cnt].v=v;
    edge[cnt].nxt=head[u];
    head[u]=cnt;
}
void dfs(int u,int fa){
    if(col[u]==0){
        sum0++;
    }
    else{
        sum1++;
    }
    for(int i=head[u];i;i=edge[i].nxt){
        int v=edge[i].v;
        if(v!=fa){
            if(col[v]!=-1){
                flag=false;
                return;
            }
            col[v]=col[u]^1;
            vis[v]=1;
            dfs(v,u);
        }
    }
    return;
}
int main(){
    int u,v;
    scanf("%d%d",&n,&m);
    memset(col,-1,sizeof(col));
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    for(int i=1;i<=n;i++){
        sum0=sum1=0;
        if(!vis[i]){
            col[i]=1;
            dfs(i,-1);
        }
        if(!flag){
            printf("Impossible\n");
            return 0;
        }
        ans+=min(sum0,sum1);
    }
    printf("%d\n",ans);
    return 0;
}

P1330 封锁阳光大学

标签:node   直接   ==   string   main   eof   min   possible   输出   

原文地址:https://www.cnblogs.com/ukcxrtjr/p/11612330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!