1009 - Back to Underworld(二分图染色)

http://www.lightoj.com/volume_showproblem.php?problem=1009


1009 - Back to Underworld
Time Limit: 4 second(s)Memory Limit: 32 MB

The Vampires and Lykans are fighting each other to death. The war has become so fierce that, none knows who will win. The humans want to know who will survive finally. But humans are afraid of going to the battlefield.

So, they made a plan. They collected the information from the newspapers of Vampires and Lykans. They found the information about all the dual fights. Dual fight means a fight between a Lykan and a Vampire. They know the name of the dual fighters, but don't know which one of them is a Vampire or a Lykan.

So, the humans listed all the rivals. They want to find the maximum possible number of Vampires or Lykans.

Input

Input starts with an integer T (≤ 10), denoting the number of test cases.

Each case contains an integer n (1 ≤ n ≤ 105), denoting the number of dual fights. Each of the next n lines will contain two different integers u v (1 ≤ u, v ≤ 20000) denoting there was a fight between u and v. No rival will be reported more than once.

Output

For each case, print the case number and the maximum possible members of any race.

Sample Input

Output for Sample Input

2

2

1 2

2 3

3

1 2

2 3

4 2

Case 1: 2

Case 2: 3

Note

Dataset is huge, use faster I/O methods.

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <string>
#define SI(T)int T;scanf("%d",&T)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
using namespace std;
const int SIZE=2e4+10;
const int maxn=1<<30;
int vis[SIZE];
int node[SIZE];
int sum_tot[SIZE][2];
vector<vector<int> >G;
void bfs(int s,int tot){
    queue<int> q;
    q.push(s);
    vis[s]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        sum_tot[tot][vis[u]]++;
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            if(vis[v]!=-1)continue;//匹配过了return false;
            q.push(v);
            vis[v]=vis[u]^1;
        }
    }
    return;
}
int main()
{
    SI(T);
    for(int cas=1;cas<=T;cas++){
        G.clear();
        G.resize(SIZE);
        memset(vis,0,sizeof(vis));
        int n,u,v,cnt=0;
        scanf("%d",&n);
        while(n--){
            scanf("%d%d",&u,&v);
            if(!vis[u]){
                node[cnt++]=u;
                vis[u]=1;
            }
            if(!vis[v]){
                node[cnt++]=v;
                vis[v]=1;
            }
            G[u].push_back(v);
            G[v].push_back(u);
        }
        int tot=0;
        memset(vis,-1,sizeof(vis));
        memset(sum_tot,0,sizeof(sum_tot));
        for(int i=0;i<cnt;i++){
            int x=node[i];
            if(vis[x]==-1){
                bfs(x,tot++);
            }
        }
        int ans=0;
        for(int i=0;i<tot;i++){
            ans+=max(sum_tot[i][0],sum_tot[i][1]);
        }
        printf("Case %d: %d\n",cas,ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Underworld2 是一个用于地球科学和计算力学领域的开源数值模拟软件。它主要用于模拟地壳和地球内部的物理过程,如地质变形、地热传导和流体运动等。 使用 Underworld2 进行数值模拟通常需要以下步骤: 1. 安装:首先,你需要根据你的操作系统下载并安装 Underworld2。你可以从官方网站或 GitHub 上找到最新的安装包和安装指南。 2. 准备输入数据:在开始模拟之前,你需要准备输入数据,包括网格文件、初始条件和边界条件等。Underworld2 支持多种数据格式,如 Gmsh、LaGriT 和 Exodus。 3. 编写模拟脚本:使用 Python 编写一个脚本来描述你的数值模拟实验。Underworld2 提供了丰富的 Python API,使你能够定义网格、物理参数和边界条件等。你可以在脚本中指定模拟的时间步长、结束时间和输出频率等。 4. 运行模拟:运行你编写的模拟脚本,Underworld2 将根据你的设定执行数值模拟。它会在每个时间步长中解决模拟方程,并输出结果。 5. 后处理结果:一旦模拟完成,你可以使用 Underworld2 提供的后处理工具来分析和可视化模拟结果。这些工具可以帮助你理解地质过程的演化和预测地球内部的行为。 这只是 Underworld2 的基本使用流程,具体的细节和技术细节取决于你的具体模拟需求和研究目标。你可以参考 Underworld2 的官方文档和示例来深入了解其功能和用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值