1. 程式人生 > >【並查集模板】阿瓦的手套加強版

【並查集模板】阿瓦的手套加強版

() 現在 沒有 include 行為 its 世界 return !=

題目描述

阿瓦所在的幻想世界迎來冬季啦!
阿瓦是只可愛的小貓,她為了這個冬天買了好多好多的手套,兔阿卡舉辦了一個長長的冬眠營並邀請了阿瓦參加,阿瓦準備每天都戴不同的手套。
兔阿卡舉辦的冬眠營一共有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; }

【並查集模板】阿瓦的手套加強版