版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/88759424
前言
做A组被虐好惨
成绩
是有算别人的
正题
【图论 】
链接:
https://blog.csdn.net/Mr_wuyongcong/article/details/88758950
【图论 模拟】
链接:
https://blog.csdn.net/Mr_wuyongcong/article/details/88758992
【统计,字符串 容斥】
链接:
https://blog.csdn.net/Mr_wuyongcong/article/details/88759105
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct edge{
int x,y,w;
}a[50];
int n,m,MS,ans;
int count_one(int x)
{
int ans=0;
while(x){
ans++;
x-=(x&-x);
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
if(n>20||m>20){
printf("-1");
return 0;
}
for(int i=1;i<=m;i++)
{
char c;
scanf("%d %d %c",&a[i].x,&a[i].y,&c);
a[i].x--;a[i].y--;
a[i].w=(c=='R');
}
MS=1<<n;ans=233333;
for(int i=0;i<MS;i++)
{
bool flag=0;
for(int j=1;j<=m;j++)
if((((i>>a[j].x)&1)+((i>>a[j].y)&1))%2!=a[j].w){
flag=1;break;
}
if(flag) continue;
ans=min(ans,count_one(i));
}
for(int i=0;i<MS;i++)
{
bool flag=0;
for(int j=1;j<=m;j++)
if((((i>>a[j].x)&1)+((i>>a[j].y)&1))%2==a[j].w){
flag=1;break;
}
if(flag) continue;
ans=min(ans,count_one(i));
}
if(ans>n) printf("-1");
else printf("%d",ans);
}
总结
看题预估分
做题预估分
实际分数
开始不会,后来发现可以枚举中间两个点,结果忘记特判凉掉。
开始不会,写了个暴力,然后突然发现了一个神奇的性质,切掉。
是啥???
尾声