并查集+数学

这道题网上好像有两种解法。

这位写的很可读:http://blog.csdn.net/unicornt_/article/details/51901225

然后看完大概就懂了做法,但是实现上还有很多细小的地方。

cnt要-1,因为第一行和第一列会算两次。

数组要开四倍。

至于为什么要拆成两个点,这是因为分开考虑01.

为什么两个flag都要赋值?因为有可能根是放在列上了,就判不到了。

还需要思考一下。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
const ll mod = ;
struct dsu {
int fa[N * ];
void ini(int n)
{
for(int i = ; i <= n; ++i)
fa[i] = i;
}
int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void connect(int x, int y)
{
fa[find(x)] = find(y);
}
bool same(int x, int y)
{
return find(x) == find(y);
}
} u;
int n, m, k, s = -;
int x[N], y[N], c[N];
ll ans;
bool flag[N * ];
ll power(ll x, ll t)
{
ll ret = ;
for(; t; t >>= , x = x * x % mod) if(t & ) ret = ret * x % mod;
return ret;
}
void solve(int s)
{
u.ini( * n + * m + );
u.connect(, + * n);
u.connect(, + * n + );
for(int i = ; i <= k; ++i)
{
int p = ;
if(x[i] % == && y[i] % == ) p = ;
p = p ^ c[i] ^ s;
if(p)
{
u.connect(x[i] * , y[i] * + + * n);
u.connect(x[i] * + , y[i] * + * n);
}
else
{
u.connect(x[i] * , y[i] * + * n);
u.connect(x[i] * + , y[i] * + * n + );
}
}
int cnt = ;
memset(flag, , sizeof(flag));
for(int i = ; i <= n; ++i)
{
if(u.same(i * , i * + ))
return;
if(!flag[u.find(i * )])
{
flag[u.find(i * )] = flag[u.find(i * + )] = ;
++cnt;
}
}
for(int i = ; i <= m; ++i)
{
if(u.same(i * + * n, i * + * n + ))
return;
if(!flag[u.find(i * + * n)])
{
flag[u.find(i * + * n)] = flag[u.find(i * + * n + )] = ;
++cnt;
}
}
ans = (ans + power(2ll, cnt - )) % mod;
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for(int i = ; i <= k; ++i)
{
scanf("%d%d%d", &x[i], &y[i], &c[i]);
if(x[i] == && y[i] == ) s = c[i];
}
if(s != ) solve();
if(s != ) solve();
printf("%lld\n", ans);
return ;
}

最新文章

  1. SpringMVC学习--入门程序
  2. DSP using MATLAB 示例Example3.1 3.2 3.3
  3. HTML&amp;CSS学习笔记(一)
  4. 今天开始着手原来Office系统的重构
  5. [ASP.net教程]ASP.NET保存信息总结(Application、Session、Cookie、ViewState和Cache等)
  6. Java图形化界面设计——布局管理器之GridLayout(网格布局)
  7. 【百度地图API】如何快速创建带有标注的地图?——快速创建地图工具+如何标注商家
  8. Java编程题:&#160;写一个Singleton出来
  9. 关于CDN与缓存(浏览器和CDN)
  10. JDBC-Transaction
  11. 初学CSS-2-文本的属性
  12. 使用zip.js压缩文件和解压文件
  13. item 1:理解template类型的推导
  14. Node+Express的跨域访问控制问题:Access-Control-Allow-Origin
  15. Terminal Service 终端链接
  16. 【题解】 Test 买水的ACX(套路)
  17. codeforces 853b//Jury Meeting// Codeforces Round #433 (Div. 1)
  18. 【令人振奋】【转】微软潘正磊谈DevOps、Visual Studio 2013新功能、.NET未来
  19. C#管理windows服务
  20. .NET:鲜为人知的 “Load Context”

热门文章

  1. Python 之字符串操作
  2. vue中使用Swiper
  3. 微信小程序animation
  4. cshtml中字符串中表示特殊字符@
  5. 基础:Post和Get区别
  6. HDU 3152 Obstacle Course(优先队列,广搜)
  7. Linux之iptables(二、基本认识和组成)
  8. python 简单爬取今日头条热点新闻(一)
  9. Spring MVC学习总结(9)——Spring MVC整合swagger自动生成api接口文档
  10. 超经典SQL练习题,做完这些你的SQL就过关了