【UR #19】清扫银河(高斯消元 / bitset)

传送门

考虑对于第二个操作,显然最多进行一次
对于第一个操作,由于环异或环还是环
所以最多进行不到 m m m
所以次数限制是假的,只用考虑是否可行
考虑先利用第二个操作,使得所有 " 1 " "1" "1"边恰好形成若干个环
而若干个环等价于所有点度数为偶数
则即可变成对于点的度数的限制
高斯消元解异或方程即可

复杂度 O ( T n 3 w ) O(T\frac{n^3}{w}) O(Twn3)

#include<bits/stdc++.h>
using namespace std;
#define cs const
#define re register
#define pb push_back
#define pii pair<int,int>
#define ll long long
#define y1 shinkle
#define fi first
#define se second
#define bg begin
cs int RLEN=1<<20|1;
inline char gc(){
    static char ibuf[RLEN],*ib,*ob;
    (ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
    return (ib==ob)?EOF:*ib++;
}
inline int read(){
    char ch=gc();
    int res=0;bool f=1;
    while(!isdigit(ch))f^=ch=='-',ch=gc();
    while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
    return f?res:-res;
}
inline ll readll(){
    char ch=gc();
    ll res=0;bool f=1;
    while(!isdigit(ch))f^=ch=='-',ch=gc();
    while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
    return f?res:-res;
}
inline int readstring(char *s){
	int top=0;char ch=gc();
	while(isspace(ch))ch=gc();
	while(!isspace(ch)&&ch!=EOF)s[++top]=ch,ch=gc();
	return top;
}
template<typename tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
template<typename tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
cs int N=301;
bitset<N> a[N];
int d[N],lk[N],n,m;
inline bool gauss(){
	for(int i=0;i<n;i++){
		int ps=i;
		for(;ps<n;ps++)if(a[ps][i])break;
		if(ps==n)continue;
		if(ps!=i)swap(a[ps],a[i]);
		for(int j=0;j<n;j++)if(a[j][i]&&j!=i)a[j]^=a[i];
	}
	for(int i=0;i<n;i++)if(a[i][n]&&!a[i][i])return false;
	return true;
}
inline void solve(){
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int u=read()-1,v=read()-1,w=read();
		d[u]^=1,d[v]^=1;
		a[u][v]=a[v][u]=1;
		lk[u]^=w,lk[v]^=w;
	}
	for(int i=0;i<n;i++)a[i][i]=d[i],a[i][n]=lk[i];
	cout<<(gauss()?"yes":"no")<<'\n';
	for(int i=0;i<n;i++)a[i].reset(),lk[i]=d[i]=0;
}
int main(){
	#ifdef Stargazer
	freopen("lx.in","r",stdin);
	#endif
	int T=read();
	while(T--)solve();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这些头文件是C++编程中常用的库文件,主要作用如下: - #include <iostream>:用于输入输出流的操作,如输出到控制台等。 - #include "ros/ros.h":ROS机器人操作系统的头文件,用于机器人程序的编写。 - #include "std_msgs/String.h":ROS中的标准消息类型,用于传递字符串类型的消息。 - #include "std_msgs/Float32.h":ROS中的标准消息类型,用于传递浮点型数据。 - #include <sstream>:用于字符串流的操作,如将数字转换为字符串等。 - #include "math.h":数学库文件,提供了许多常用的数学函数。 - #include "can_drive/ICANCmd.h":自定义消息类型,用于控制CAN总线通信。 - #include "can_drive/Nav_data_msg.h":自定义消息类型,用于传递导航数据。 - #include "can_drive/encoder_vel_msg.h":自定义消息类型,用于传递编码器速度数据。 - #include "can_drive/radar_obs_msg.h":自定义消息类型,用于传递雷达障碍物数据。 - #include "can_drive/camera_obs_msg.h":自定义消息类型,用于传递摄像头障碍物数据。 - #include "sensor_msgs/Imu.h":ROS中的标准消息类型,用于传递IMU数据。 - #include "can_drive/pwm_cmd_msg.h":自定义消息类型,用于控制PWM信号输出。 - #include "can_drive/sensor_states_msg.h":自定义消息类型,用于传递各种传感器状态数据。 - #include <tf/tf.h>:ROS中的变换库文件,用于实现坐标系变换。 - #include <bitset>:二进制库文件,提供了位运算的一些常用函数。 - #include <string>:字符串库文件,提供了许多字符串操作的函数。 - #include <algorithm>:STL算法库文件,提供了许多常用的算法函数。 - #include <thread>:C++11中的多线程库文件,用于实现多线程编程。 - #include <pthread.h>:POSIX线程库文件,用于实现多线程编程。 - #include <time.h>:时间库文件,提供了许多时间相关的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值