南洋工科大学のACMドールレース兼16は記念C PKノーガールフレンドを引退していません

トピック出典:http://acm.nyist.edu.cn/problem/1663
件名の説明:

先月以来のPKは、PKのガールフレンドは最近、彼を無視して、通常の彼女のガールフレンドを見に行きませんでした。長距離関係が硬すぎる、距離工科教師は、彼のために、広州に駐馬店距離のようなものです。
:詩は書いていた
ではない遠く離れて、世界で最も遠い距離、距離のない生と死を、私はあなたの前に立ったとき、あなたは私はあなたを愛していることを知りません。
PKは、彼のガールフレンドの心を救うことを期待して、彼のガールフレンドのネックレスを与えることを決めたが、彼は長いACMは彼を助けるためにあなたのネックレスが何であるかを言うことができないので、希望の果たしてきました。
目に、彼が縁部を構成するNポイントを購入し、図にMがない。(......)。この図は、裁判官のネックレスではありません、我々は以下の3つのことを実行する必要があります。
1.まず、地図上のリングを見つける必要があります。そして、我々はこれが唯一のマップ上のリングで見つけることができることを確認する必要があります。
2.リングは、これらの木は、リング上で根付いた、いくつかの木を育てることができます。ツリーは、少なくとも1つのノードで構成されなければならないが、美的な理由のために、あなたは、少なくとも3本の木を見つけることができるはずです。
3.自重側とリングが許可されています。そうでない場合は、女の子が誤って内部に頭を入れていること、そして......出て
、他の言葉で、それはリングの唯一の有資格ビューは、少なくとも3クラスツリー、ない重い側とループバックで構成することができるようにする必要があります。
上記の3つの条件が満たされた場合は、PKは非常に満足してビンゴを叫んなります。そうでなければ、彼のガールフレンドは彼と別れるでしょう......

説明を入力します。

最初の行は、所与のN、M(1 <= N <= 100、0 <= M <= 10 ^ 5)。
続いて行をM、各行は二つの整数UIを有し、VI(1 <= UI 、VI <= n)を、UIとVIとの間に接続されたエッジを表現。複数のエッジとループバックがあるかもしれません。

出力説明:

ネックレスは出力ビンゴであれば、それ以外の出力がアップブレイク。

サンプル入力:
6 6
6 3
6 4
5 1
2 5
1 4
5 4

6 5
5 6
4 6
3 1
5 1
1 2
出力例:
Bingo
Break up

溶液1
満足
1.n == M
。2.n> = 3つの
3.いいえ重い縁とループバックは、
ネックレスである
方法2
(意図したタイトルに応じて完了することに直接検索

/**
6 6
6 3
6 4
5 1
2 5
1 4
5 4

6 5
5 6
4 6
3 1
5 1
1 2
**/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#define ll long long
const int N=1e5+5;
#define inf 0x3f3f3f3f
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
struct node
{
    int n,m,k;
}xl[N];
int ans,sum,n,m,flag;
vector<int> tu[105];
ll a[105][105],b[105],check[105],vis[105];
void dfs(int x){
    for(int i=0;i<tu[x].size();i++){
        if(!vis[tu[x][i]]){
            vis[tu[x][i]]=1;
            check[tu[x][i]]=ans;
            dfs(tu[x][i]);
        }
    }
}
bool dfss(int x,int y){
    if(b[x]==1)
        sum++;
    if(xl[y].n-sum<3)
        return false;
    for(int i=0;i<tu[x].size();i++){
        if(!vis[tu[x][i]]){
            int k=tu[x][i];
            vis[k]=1;
            if(!dfss(k,y))
                return 0;
        }
    }
    return 1;
}
int main(){
    int x,y,i;while (cin>>n>>m) {
        mem(xl, 0);
        mem(a, 0);
        for (i = 1; i <= m; i++) {
            cin >> x >> y;
            if (a[x][y] == 0) {
                tu[x].push_back(y);
                tu[y].push_back(x);
            }
            a[x][y]++;
            a[y][x]++;
            b[x]++;
            b[y]++;
        }
        if (n != m || n < 3) {
            cout << "Break up" << endl;
            return 0;
        }
        vis[xl[i].k] = 1;
        mem(vis, 0);
        mem(check, 0);
        ans = 0;
        for (i = 1; i <= n; i++) {
            if (!vis[i]) {
                vis[i] = 1;
                ans++;
                check[i] = ans;
                dfs(i);
            }
        }
        for (i = 1; i <= n; i++) {
            int k = check[i];
            xl[k].n++;
            for (int j = 1; j <= n; j++) {
                xl[k].m += a[i][j];
            }
            xl[k].k = i;
        }
        flag = 0;
        for (i = 1; i <= ans; i++) {
            if (xl[i].n == xl[i].m / 2 && xl[i].n >= 3) {
                sum = 0;
                memset(vis, 0, sizeof(vis));
                vis[xl[i].k] = 1;
                if (dfss(xl[i].k, i)) {
                    flag++;
                }
            }
        }
        if (flag == 1) {
            cout << "Bingo" << endl;
        } else {
            cout << "Break up" << endl;
        }
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/nuoyanli/article/details/92446459