• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yongchaoD

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

P1989 无向图三元环计数(三元环)

题目来源:https://www.luogu.com.cn/problem/P1989
//
题意:给你一个图,问图中有多少个三元环(板子题)
//
思路:每个u点的出边点v打上u标记,然后枚举v点,如果v点的出点w被标记了u,那么该(u,v,w)就是一个三元环
//
代码细节:出度多的指向少的,否则编号小的指向编号大的
//
题解:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+9;
struct Nod{
    int u,v;
}e[N];
int deg[N],vis[N],ans=0;
vector<int>g[N];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>e[i].u>>e[i].v;
        ++deg[e[i].u],++deg[e[i].v];
    }
    for(int i=1;i<=m;i++){//出度多的指向少的,否则编号小的指向编号大的
        int u=e[i].u,v=e[i].v;
        if(deg[u]<deg[v] || (deg[u]==deg[v]&&u>v)){swap(u,v);}
        g[u].push_back(v);
    }

    for(int u=1;u<=n;u++){
        for(auto v:g[u]){vis[v]=u;}//每个u点的出边点v打上u标记,然后枚举v点,如果v点的出点w被标记了u,那么该(u,v,w)就是一个三元环
        for(auto v:g[u]){
            for(auto w:g[v]){
                if(vis[w]==u){ans++;}
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

posted on 2024-09-08 16:25  yongchaoD  阅读(15)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3