列表

详情


NC239287. 平面图三元环

描述

给你一个n个点m条边的无向平面图,请你求出其中包含的三元环数量。

输入描述

第一行两个整数n,m

接下来m行每行两个整数u,v表示一条无向边(u,v)

输出描述

一个整数,表示答案。

示例1

输入:

3 3
1 2
2 3
3 1

输出:

1

示例2

输入:

5 8
1 2
2 3
3 5
5 4
4 2
5 2
1 4
3 4

输出:

5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 46ms, 内存消耗: 7236K, 提交时间: 2022-09-06 19:43:11

#include <bits/stdc++.h>

using namespace std;

#define N 100010
#define M 200010

int n, m, U[M], V[M], d[N];
vector <int> e[N];
bool vis[N];
long long ans;

int main() {
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; ++i) {
        scanf("%d %d", U + i, V + i);
        ++d[U[i]], ++d[V[i]];
    }
    for (int i = 1; i <= m; ++i) {
        if (U[i] > V[i]) swap(U[i], V[i]);
        if (d[U[i]] < d[V[i]]) e[V[i]].push_back(U[i]);
        else e[U[i]].push_back(V[i]);
    }
    for (int u = 1; u <= n; ++u) {
        for (int v : e[u]) vis[v] = true;
        for (int v : e[u])
            for (int w : e[v])
                if (vis[w]) ++ans;
        for (int v : e[u]) vis[v] = false;
    }
    printf("%lld\n", ans);
    
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 98ms, 内存消耗: 9908K, 提交时间: 2022-09-08 16:41:58

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int d[N],x[N],y[N];
vector<int>a[N];
int v[N];
int main()
{
	int n,m,ans=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>x[i]>>y[i];
		d[x[i]]++,d[y[i]]++;	
	}
	for(int i=1;i<=m;i++)
		if(d[x[i]]==d[y[i]])x[i]>y[i]?a[x[i]].push_back(y[i]):a[y[i]].push_back(x[i]);
		else d[x[i]]>d[y[i]]?a[x[i]].push_back(y[i]):a[y[i]].push_back(x[i]);
	for(int i=1;i<=n;i++)
	{
		for(auto j:a[i])v[j]=i;
		for(auto j:a[i])
			for(auto k:a[j])
				if(v[k]==i)ans++;
	}	
	cout<<ans;
	return 0;
}

上一题