Dili_iiii

编码全要靠底力

【并查集模板】阿瓦的手套加强版

题目描述

阿瓦所在的幻想世界迎来冬季啦!
阿瓦是只可爱的小猫,她为了这个冬天买了好多好多的手套,兔阿卡举办了一个长长的冬眠营并邀请了阿瓦参加,阿瓦准备每天都戴不同的手套。
兔阿卡举办的冬眠营一共有T天,每一天的早晨,阿瓦都早早地起床挑选手套。她一共有n只手套,每只手套都互不相同。阿瓦每天会在所有的n只手套中挑选两只佩戴,阿瓦认为戴两只颜色不同的手套是一种怪异的行为,因此她希望每天的两只手套都是相同颜色的。
阿瓦现在的n只手套都没有染过色,阿瓦来到阿卡的地方,希望阿卡帮忙将每一只手套染一种颜色,阿卡一共有m种颜色的染料,每种染料你都可以看做有无限的供应量.阿瓦想要知道,有多少种染色方案使得自己在冬眠营的每一夭都可以戴上颜色相同的手套。
当存在一只手套在两种方案中的颜色不一样时,我们说这两种染色方案是不同的。

 

输入

第一行三个数n,m,T。意义如题面中所述。
接下来T行,第i行两个数xi,yi。表示第i天阿瓦要戴的两只手套的编号。

 

输出

一行一个数表示答案,对998244353取模。
 
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=998244353;
int pre[100005],ran[100005];
int n,m,t;
int init(int n)
{
    for(int i=1;i<=n;i++)
    {
        pre[i]=i;
        ran[i]=1;
    }
}
int find_pre(int x)
{
    while(x!=pre[x])
        x=pre[x];
    return x;
}
bool is_t(int x,int y)
{
    return find_pre(x)==find_pre(y);
}
void unitey(int x,int y)
{
    int rx,ry;
    rx=find_pre(x);
    ry=find_pre(y);
    if(rx!=ry)
        {pre[rx]=ry;}
}
ll qm(ll a,ll b)
{
    ll ret=1;
    while(b)
    {
        if(b&1)
            ret=ret*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ret%mod;
}
int main()
{
    scanf("%d %d %d",&n,&m,&t);
    int cnt=0,ant=0;
    init(n);
    for(int i=0;i<t;i++)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        unitey(x,y);
    }
    for(int i=1;i<=n;i++)
    {
        //cout<<pre[i]<<endl;
        if(pre[i]==i)
            ant++;
    }
    printf("%lld\n",qm(1ll*m,1ll*ant));
    return 0;
}

 

posted @ 2019-01-17 21:52  Dili_iiii  阅读(300)  评论(0编辑  收藏  举报