Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1)

**

B. Bear and Friendship Condition

**

题意:给一个顶点和边不超过15W的图,问你这个图的所有连通分量是不是一个完全子图(if the graph is a set of disjoint cliques),对此,我们只需要对所有连通分量跑一下DFS,看看每个连通分量中的边数和顶点数是不是满足完全子图的关系就可以了
cnt_edges != (long long) cnt_vertices * (cnt_vertices - 1)

#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);

#define INF 0x3f3f3f3f
#define eps 1e-5

typedef long long LL;
const double pi = acos(-1.0);
const long long mod = 25 * 1E8;
using namespace std;

const int nax = 150005;

vector<int> edges[nax];
bool vis[nax];

void dfs(int a, int & cnt_vertices, int & cnt_edges) {
    assert(!vis[a]);
    vis[a] = true;
    ++cnt_vertices;
    cnt_edges += edges[a].size();

    for(int i = 0;i < edges[a].size();i++)
        if(!vis[edges[a][i]])
            dfs(edges[a][i], cnt_vertices, cnt_edges);
    /*
    for(int b : edges[a])
        if(!vis[b])
            dfs(b, cnt_vertices, cnt_edges);
    */
}

int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n, m;
    scanf("%d%d", &n, &m);
    while(m--) {
        int a, b;
        scanf("%d%d", &a, &b);
        edges[a].push_back(b);
        edges[b].push_back(a);
    }
    for(int i = 1; i <= n; ++i)
        if(!vis[i]) {
            int cnt_vertices = 0, cnt_edges = 0;
            dfs(i, cnt_vertices, cnt_edges);
            if(cnt_edges != (long long) cnt_vertices * (cnt_vertices - 1)) {
                puts("NO");
                return 0;
            }
        }
    puts("YES");
    return 0;
}

**

C. Bear and Different Names

**

#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);

#define INF 0x3f3f3f3f
#define eps 1e-5

typedef long long LL;
const double pi = acos(-1.0);
const long long mod = 25 * 1E8;
using namespace std;

const int nax = 150005;

string s1[105],s2[105];

int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n, m;
    cin >> n >> m;
    for(int i = 0;i < n - m + 1;i++)
        cin >> s1[i];

    for(int i = 0;i < 52;i++)
    {
        s2[i] = "Aa";
        s2[i][0] += i / 26;
        s2[i][1] += i % 26;
    }

    for(int i = 0;i < n - m + 1;i++)
        if(s1[i] == "NO")
            s2[i + m - 1] = s2[i];
    for(int i = 0;i < n - 1;i++)
        cout << s2[i] << ' ' ;
    cout << s2[n - 1] << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值