Lightoj 1009

来源:互联网 发布:小米wifi无法加入网络 编辑:程序博客网 时间:2024/06/08 18:04

题意: 两方战争,求可能最大的一方军队人数。
思路: 看了一下别人的代码,是用二分图染色写的。

AC代码:

//Lightoj 1009#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <cmath>#include <queue>#include <stack>#include <map>#include <set>#define ll long long#define llu unsigned long long#define INF 0x3f3f3fusing namespace std;const int maxn=20010;vector<int>g[maxn],v[maxn];int vis[maxn];int color[maxn];int cnt;void init() {    cnt=0;    for(int i=1; i<=maxn; i++) {        vis[i]=0; color[i]=0;        g[i].clear();        v[i].clear();    }}void dfs(int x,int r) {    int s=g[x].size();    for(int i=0; i<s; i++) {        int t=g[x][i];        if(vis[t] && !color[t]) {            v[cnt].push_back(t);            color[t]=3-r;            dfs(t, color[t]);        }    }}int main(){    int t; int n;    scanf("%d",&t);    for(int cas=1; cas<=t; cas++) {        init();        int Max=-1; scanf("%d",&n);        for(int i=1; i<=n; i++) {            int u,v; scanf("%d%d",&u,&v);            Max=max(Max,max(v,u));            vis[u]=1; vis[v]=1;            g[u].push_back(v);            g[v].push_back(u);        }        for(int i=1; i<=Max; i++) {            if(vis[i] && !color[i]) {                cnt++;                v[cnt].push_back(i);                color[i]=1;                dfs(i,1);            }        }        int ans=0;        for(int i=1; i<=cnt; i++) {            int c1=0,c2=0;            for(int j=0; j<v[i].size(); j++) {                if(color[v[i][j]]==1) c1++;                if(color[v[i][j]]==2) c2++;            }            ans+=max(c1,c2);        }        printf("Case %d: %d\n",cas,ans);    }    return 0;}
0 0
原创粉丝点击