B.
因为只有四种情况,旋转90/180/270度后替换,直接替换,暴力即可
C.
循环图的定义是每个点出度为2,而且只有一个环的,所以先判断出度,再判断是否成环
cpp
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,cnt;
int degree[200010];
vector<vector<int>> a;
bool vis[200010];
bool flag;
void dfs(int x){
cnt++;
vis[x]=1;
for(int u:a[x]){
if(!vis[u]){
dfs(u);
}
}
}
int main()
{
cin>>n>>m;
a.resize(n + 1);
for(int i=0;i<m;i++){
cin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
degree[x]++;
degree[y]++;
}
for(int i=1;i<=n;i++){
if(degree[i]!=2){
cout<<"No"<<endl;
return 0;
}
}
dfs(1);
if(cnt==n) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}
D.
暴力做法,对于每一个动物园有三种状态,看0/1/2次,所以用dfs枚举三种状态,复杂度是3的n次方,n<=10,所以问题不大
cpp
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y;
long long mins;
int a[15],degree[15],aa[110];
vector<vector<int>> b;
void dfs(int x){
if(x==n+1){
for(int i=1;i<=m;i++) aa[i]=0;//重置计数数组
for(int i=1;i<=n;i++){
for(int j=0;j<degree[i];j++){
for(int u:b[i]) aa[u]++;
}
}
// for(int i=1;i<=n;i++) cout<<degree[i]<<" ";cout<<endl;
// if(degree[3]==2&°ree[4]==2){
// for(int i=1;i<=n;i++) cout<<degree[i]<<" ";cout<<endl;
// for(int i=1;i<=m;i++) cout<<aa[i]<<" ";cout<<endl;
// }
for(int i=1;i<=m;i++){
if(aa[i]<2) return;
}
// if(degree[3]==2&°ree[4]==2){
// for(int i=1;i<=n;i++) cout<<degree[i]<<" ";cout<<endl;
// for(int i=1;i<=m;i++) cout<<aa[i]<<" ";cout<<endl;
// }
long long sum=0;
for(int i=1;i<=n;i++){
sum+=a[i]*degree[i];
}
// cout<<sum<<endl;
// for(int i=1;i<=n;i++) cout<<degree[i]<<" ";cout<<endl;
mins=min(mins,sum);
return;
}
for(int i=0;i<3;i++){
degree[x]=i;
dfs(x+1);
degree[x]=0;
}
}
int main()
{
cin>>n>>m;
b.resize(n+1);
mins=1e18;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++){
cin>>x;
for(int j=0;j<x;j++) cin>>y,b[y].push_back(i);
}
dfs(1);
cout<<mins<<endl;
return 0;
}
E.
最核心的事情就是让最后一个豆子在回到起点的同时,路过所有有豆子的地方
所以我们就可以按照我们的想法建单向边,对于有豆子的地方可以分配的前c[i]范围内都没豆子的话都建边,如果有豆子的话就找最近的豆子建边,这样可以保证路过所有有豆子的地方,最后跑一个最短路算法dijkstra就可以了,记得最后一个点不一定有豆子,所以直接遍历找最后一个豆子
cpp
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
int n,flag,c[2010],a[2010],dist[2010],vis[2010];
vector<vector<int>> adj;
void dijkstra(){
priority_queue<PII> heap;
heap.push({0,0});
while(heap.size()){
int u=heap.top().first;
heap.pop();
if(vis[u]) continue;
vis[u]=1;
for(auto v:adj[u]){
if(dist[v]>dist[u]+1){
dist[v]=dist[u]+1;
heap.push({v,-dist[v]});
}
}
}
}
int main()
{
cin>>n;
adj.resize(n+1);
for(int i=1;i<n;i++) cin>>c[i];
for(int i=1;i<n;i++) cin>>a[i];
for(int i=1;i<n;i++){
flag=0;
for(int j=1;j<=c[i];j++){
if(a[i-j]){
flag=1;
adj[i-j].push_back(i);
break;
}
}
if(!flag){
for(int j=1;j<=c[i];j++){
adj[i-j].push_back(i);
}
}
}
memset(dist,0x3f,sizeof dist);
dist[0]=0;
dijkstra();
int maxs=0;
for(int i=1;i<n;i++){
if(a[i]) maxs=max(maxs,dist[i]);
}
cout<<maxs<<endl;
return 0;
}