zoukankan      html  css  js  c++  java
  • HDU 6184 Counting Stars

    HDU 6184
    思路:三元环。将无向图转换成有向无环图,详见洛谷日报

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    #pragma GCC optimize(4)
    #include<bits/stdc++.h>
    using namespace std;
    #define y1 y11
    #define fi first
    #define se second
    #define pi acos(-1.0)
    #define LL long long
    //#define mp make_pair
    #define pb emplace_back
    #define ls rt<<1, l, m
    #define rs rt<<1|1, m+1, r
    #define ULL unsigned LL
    #define pll pair<LL, LL>
    #define pli pair<LL, int>
    #define pii pair<int, int>
    #define piii pair<pii, int>
    #define pdd pair<double, double>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define debug(x) cerr << #x << " = " << x << "
    ";
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    //head
    
    const int N = 2e5 + 5;
    vector<int> g[N];
    struct Node {int u, v;}e[N];
    int n, m, d[N], vis[N], cnt[N];
    int main() {
        while(~scanf("%d %d", &n, &m)) {
            for (int i = 1; i <= m; ++i) scanf("%d %d", &e[i].u, &e[i].v), d[e[i].u]++, d[e[i].v]++;
            for (int i = 1; i <= m; ++i) {
                if(d[e[i].u] < d[e[i].v]) swap(e[i].u, e[i].v);
                if(d[e[i].u] == d[e[i].v] && e[i].u > e[i].v) swap(e[i].u, e[i].v);
                g[e[i].u].pb(i);
            }
            for (int u = 1; u <= n; ++u) {
                for (int id : g[u]) {
                    int to = u^e[id].u^e[id].v;
                    vis[to] = id;
                }
                for (int id : g[u]) {
                    int to = u^e[id].u^e[id].v;
                    for (int ii : g[to]) {
                        int tt = to^e[ii].u^e[ii].v;
                        if(vis[tt]) {
                            cnt[id]++;
                            cnt[ii]++;
                            cnt[vis[tt]]++;
                        }
                    }
                }
                for (int id : g[u]) {
                    int to = u^e[id].u^e[id].v;
                    vis[to] = 0;
                }
            }
            LL ans = 0;
            for (int i = 1; i <= m; ++i) ans += cnt[i]*1LL*(cnt[i]-1)/2;
            printf("%lld
    ", ans);
            for (int i = 1; i <= n; ++i) g[i].clear(), d[i] = 0;
            for (int i = 1; i <= m; ++i) cnt[i] = 0;
        }
        return 0;
    }
    
    
  • 相关阅读:
    O(big oh) (big omega) (big theta)
    Ex 7_21 在一个流网络中,一条边被称为是临界的...第十三次作业
    Ex 7_17 考虑如下的网络(其中数字为对应边的容量)...第十三次作业
    Expm 10_2 实现Ford-Fulkerson算法,求出给定图中从源点s到汇点t的最大流,并输出最小割。
    pat1009
    pat1008
    pat1007
    pat1006
    pat1005
    pat1004
  • 原文地址:https://www.cnblogs.com/widsom/p/11257946.html
Copyright © 2011-2022 走看看