首页 > 其他分享 >D. Vitaly and Cycle

D. Vitaly and Cycle

时间:2024-08-01 20:51:32浏览次数:4  
标签:p2 p1 color ll next now Vitaly Cycle

原题链接

题解

往无向图中添加至少几条边,使得图中包含奇数环?
注意是要添加边,而不是使环

讨论

1.0条

当且仅当原图中存在奇环,方案数为0

用bfs染色判断,即对于一个环,bfs一定会绕一圈该环,然后黑白染色判断奇偶即可

2.一条

当且仅当存在一连通图大小大于等于3

对于该连通图内,对方案数的贡献为距离为偶数的节点对数,根据黑白染色,也就是相同颜色的节点选取两个

\(C_W^2+C_B^2\)

3.两条

当且仅当最大的连通图大小等于2,由于有m条边,所以有m个大小为2的联通块,只需要任选一个联通块和不属于该联通块的点即可

\((n-2)\cdot m\)

4.三条

联通块大小为1,也就是 \(m=0\)

\(C_n^3\)

code

#include<bits/stdc++.h>
#define ll long long
#define lb long double
#define lowbit(x) ((x)&(-x))
using namespace std;
const ll inf=1e18;
const ll mod=1e9+7;

bool flag=0;
vector<ll> G[200005];
ll color[200005]={0};
ll p1=0,p2=0;

ll dfs(ll now,ll fa,ll val)//dfs染色,子节点颜色和父节点有关
{
    color[now]=val;
    if(val==1) p1++;
    else p2++;

    ll sum=1;
    for(auto next:G[now])
    {
        if(next==fa) continue;

        if(!color[next])
        {
            sum+=dfs(next,now,-val);
        }
        else
        {
            if(color[next]==color[now])
            {
                flag=1;
                return 1;
            }
        }
    }

    return sum;
}


ll C(ll n,ll m)
{
    if(n<m) return 0;
    ll res=1;

    for(ll i=1;i<=m;i++)
    {
        res=res*(n-i+1LL);
        res=res/i;
    }
    return res;
}

void solve()
{
    ll n,m;
    cin>>n>>m;

    if(m==0)
    {
        cout<<"3 ";
        cout<<C(n,3)<<'\n';
        return;
    }

    for(ll i=1;i<=m;i++)
    {
        ll x,y;
        cin>>x>>y;

        G[x].push_back(y);
        G[y].push_back(x);
    }

    ll maxs=2;
    ll ans=0;
    for(ll i=1;i<=n;i++)
    {
        if(!color[i])
        {
            p1=0;
            p2=0;
            maxs=max(maxs,dfs(i,i,1));
            if(flag)
            {
                cout<<"0 1";
                return;
            }
            if(maxs>=3)
            {
                //printf("p1:%d  p2:%d\n",p1,p2);
                ans+=C(p1,2)+C(p2,2);
            }
        }
    }

    if(maxs==2)
    {
        cout<<"2 ";
        cout<<(n-2LL)*m<<'\n';
    }
    else
    {
        cout<<"1 ";
        cout<<ans<<'\n';
    }
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int TT=1;
    //cin>>TT;
    while(TT--) solve();
    return 0;
}

标签:p2,p1,color,ll,next,now,Vitaly,Cycle
From: https://www.cnblogs.com/pure4knowledge/p/18337487

相关文章

  • Android开发 - (适配器)Adapter类中RecyclerView.Adapter实现类详细解析
    简介RecyclerView的基础适配器,用于绑定数据和创建视图持有者具体作用RecyclerView.Adapter是Android中RecyclerView的适配器基类,负责将数据绑定到RecyclerView的子项视图上。它是RecyclerView的核心组件之一,用于处理数据集和视图之间的映射。具体来说,RecyclerVie......
  • Android TV上Recyclerview焦点控制心得
    背景:项目里有一个定时刷新的需求,刷新的数据是填充在Recyclerview里的 问题:用户可能已经滑动Recyclerview到某一位置,这时候触发了定时刷新任务,新的数据到来会触发Recyclerview的adapter.notifydatasetchanged(),这时候1.数据已经刷新,Recyclerview应该会滑动到初始位置2.Recyc......
  • IDEA 中 maven 的 Lifecycle 和Plugins 的区别
    IDEA中maven的Lifecycle和Plugins的区别+目录IDEAmaven的Lifecycle与Plugins生命周期(Lifecycle)阶段(Phase)插件(plugin)和目标(goal)补充:idea中maven的Plugins和Lifecycle区别IDEAmaven的Lifecycle与PluginsIDEA主界面右侧Maven标签栏有同样的命令,比如install,......
  • Android RecyclerView
    AndroidRecyclerView介绍RecyclerView是Android的一个高级视图组件,旨在显示大量数据的列表或网格。相比于传统的ListView,RecyclerView提供了更多的功能和灵活性。AdapterAdapter是RecyclerView的数据源,负责将数据绑定到ViewHolder上。常见的Adapter实现包括Recy......
  • CF932C Permutation Cycle
    题目传送门思路:个人认为构造题全靠感性理解,理解对了问题就迎刃而解了。(有点像做阅读理解)我们先感性地理解题目中所有变量和函数的含义。\(f\)函数是什么?当\(j\neq0\)时,\(f(i,j)=f(p_i,j-1)\),就是使\(j\)花费了\(1\)的代价,然后使\(i\)变为了\(p_i\)。这就......
  • RecyclerView 滚动到指定position,且position所在的view 居屏幕中间显示
       RecyclerView滚动到指定position,且position所在的view居屏幕中间显示;   RecyclerView的scrollToPositionWithOffset和scrollToPosition,都可以实现滚到到指定位置,但是不能让所在的view居于手机的宽度的居中位置。    RecyclerView  滚动分为平......
  • [题解]CF117C Cycle
    思路发现最简单的方法就是直接枚举三个点,但是复杂度\(\Theta(n^3)\)无法接受。考虑枚举一个点,并确定它的一条边,那么只需要再枚举一个点了。于是转化为了,对于每一个点找到其最好的出边。观察下图,\(a\toc\)的边是不必要的。因为,如果有一个三元环包含\(a\toc\),那么一定能......
  • 我的 Python 代码和 Cycle Time 小部件之间的平均周期时间不同
    我过去遇到过如何在周期时间小部件中计算平均周期时间的一些问题,因此我决定使用Python进行分析,看看是否找到任何方法来计算平均周期时间并获得相同的结果周期时间小部件中显示的值。我的问题是我无法达到周期时间小部件中显示的相同的平均周期时间值。你们能帮我解决这......
  • 【Android】ListView和RecyclerView知识总结
    文章目录ListView步骤适配器AdpterArrayAdapterSimpleAdapterBaseAdpter效率问题RecyclerView具体实现不同布局形式的设置横向滚动瀑布流网格点击事件ListViewListView是Android中的一种视图组件,用于显示可滚动的垂直列表。每个列表项都是一个视图对象,ListVie......
  • F. Vitaly and Advanced Useless Algorithms
    原题链接题解,没有思路的时候先想想暴力1.观察观察再观察,对于每个计划而言,所完成的任务是唯一的,所以要完成任务\(c\),相当于在能完成\(c\)的计划集合里,选择若干个计划,使得其总耗时最小,且完成的超过1002.这种包含两种属性限制的集合选择,不难想到背包,即相同耗时,记录完成度高的,......