A
B

多边形染色

多边形染色

#include<bits/stdc++.h>
#define int long long
#define ld double
#define con putchar_unlocked(' ')
#define ent putchar_unlocked('\n')
#define Blue_Archive return 0
using namespace std;
constexpr int N = 6e4 + 7; // ?,为啥要开到 6e4 才能过。。。?
constexpr int mod = 987654321;
constexpr int INF = 1e18;
constexpr char me[] = "終末なにしてますか?忙しいですか?救ってもらっていいですか?";

int n;
int m;
int c;
int ans;
int dp[N][15];

bool vis[N];

bitset<15> del[N];

inline int read()
{
	int k = 0,f = 1;
	char c = getchar_unlocked();
	while(c < '0' || c > '9')
	{
		if(c == '-') f = -1;
		c = getchar_unlocked();
	}
	while(c >= '0' && c <= '9') k = (k << 3) + (k << 1) + c - '0',c = getchar_unlocked();
	return k * f;
}

inline void write(int x)
{
	if(x < 0) putchar_unlocked('-'),x = -x;
	if(x > 9) write(x / 10);
	putchar_unlocked(x % 10 + '0');
}

signed main()
{
	// freopen("data.in","r",stdin);freopen("data.out","w",stdout);
	n = read();
	m = read();
	c = read();
	for(int i = 1,op,x,y;i <= m;i ++)
	{
		op = read();
		x = read();
		y = read();
		if(op == 1)
		{
			for(int j = 1;j <= c;j ++)
			{
				if(j == y) continue;
				del[x][j] = 1;
			}
		}
		if(op == 2) del[x][y] = 1; // 删掉这个点
		if(op == 3)
		{
            if(x > y) swap(x,y);
			vis[y] = 1;
		}
	}
	for(int p = 1;p <= c;p ++)
	{
		if(del[1][p]) continue;
		memset(dp,0,sizeof(dp));
		dp[1][p] = 1;
		for(int i = 2;i <= n;i ++)
		{
			if(vis[i])
			{
				for(int j = 1;j <= c;j ++) if(!del[i][j]) dp[i][j] = dp[i - 1][j];
				continue;
			}
			for(int j = 1;j <= c;j ++)
			{
				for(int k = 1;k <= c;k ++)
				{
					if(j == k || del[i][j] || (i == n && j == p)) continue;
					dp[i][j] = (dp[i][j] + dp[i - 1][k]) % mod;
				}
			}
		}
		for(int i = 1;i <= c;i ++) ans = (ans + dp[n][i]) % mod;
	}
	write(ans);ent;
	Blue_Archive;
}
posted @ 2025-10-03 21:49  MyShiroko  阅读(11)  评论(0)    收藏  举报