CF553C-Love-Triangles题解
题意:有一个
个点的无向完全图,边权为 ,钦定 条边的边权,求填剩下的边的边权的方案数,满足:不存在一个三元环全为 或二 一 。
观察第二条性质。首先显然有,如果
处理完后,一定维护出若干个由
研究完第二个限制,考虑第一个限制:不存在三元环全为
具体地,首先将全为
By cxm1024
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
struct node{int x,y,z;} a[100010];
int fa[100010];
int findf(int x) {
if(x==fa[x]) return x;
return fa[x]=findf(fa[x]);
}
vector<int> e[100010];
int col[100010],vis[100010];
void dfs(int now,bool color) {
if(vis[now]&&color!=col[now]) {
cout<<0<<endl;
exit(0);
} //不是二分图则无解
if(vis[now]) return;
vis[now]=1,col[now]=color;
for(int v:e[now]) dfs(v,!color);
}
signed main() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
cin>>a[i].x>>a[i].y>>a[i].z;
for(int i=1;i<=m;i++)
if(a[i].z==1&&findf(a[i].x)!=findf(a[i].y))
fa[findf(a[i].x)]=findf(a[i].y);
for(int i=1;i<=m;i++) {
if(a[i].z==1) continue;
if(findf(a[i].x)==findf(a[i].y)) {
cout<<0<<endl;
return 0;
} // 0的两边连通则无解,否则在缩点的新图中建边
// 这里直接把缩点的root设为了并查集的root
e[findf(a[i].x)].push_back(findf(a[i].y));
e[findf(a[i].y)].push_back(findf(a[i].x));
}
int ans=(mod+1)/2; //初始设成1/2
for(int i=1;i<=n;i++)
if(findf(i)==i&&!vis[i])
dfs(i,0),(ans*=2)%=mod;
cout<<ans<<endl;
return 0;
}
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步