L2-025 分而治之
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v[10010];
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
int k;
cin>>k;
bool st[10010]={false};
while(k--)
{
int p;
cin>>p;
memset(st,false,sizeof(st));
for(int i=0;i<p;i++)
{
int x;
cin>>x;
st[x]=true;
}
bool f=true;
for(int i=1;i<=n;i++)
{
for(int j=0;j<v[i].size();j++)
if(!st[i]&&!st[v[i][j]])
f=false;
}
if(f)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
城堡问题
城堡问题
bfs
#include <bits/stdc++.h>
using namespace std;
const int N=55;
int g[N][N];
bool st[N][N];
typedef pair<int,int> PII;
int n,m;
int bfs(int sx,int sy)
{
queue<PII> q;
q.push({sx,sy});
st[sx][sy]=true;
int are=0;
int dx[]={0,-1,0,1};
int dy[]={-1,0,1,0};
while(!q.empty())
{
are++;
PII t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
if(x<0||x>=n||y<0||y>=m) continue;
if(st[x][y]) continue;
if(g[t.first][t.second] >> i & 1) continue;
q.push({x,y});
st[x][y]=true;
}
}
return are;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
int maxx=0,ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(!st[i][j])
{
maxx=max(maxx,bfs(i,j));
ans++;
}
}
cout<<ans<<endl;
cout<<maxx;
}
格子游戏
格子游戏
并查集
#include <bits/stdc++.h>
using namespace std;
const int N=40010;
int f[N];
int n,m;
int find(int x)
{
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
int get(int x,int y)
{
return x*n+y;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n*n;i++)
f[i]=i;
int res=0;
for(int i=1;i<=m;i++)
{
int x,y;
char c;
cin>>x>>y>>c;
x--,y--;
int a=get(x,y);
int b;
if(c=='D') b=get(x+1,y);
else b=get(x,y+1);
int pa=find(a);
int pb=find(b);
if(pa==pb)
{
res=i;
break;
}
f[pa]=pb;
}
if(res==0)
cout<<"draw";
else
cout<<res;
}
红色警报
红色警报
并查集
#include <bits/stdc++.h>
using namespace std;
int f[5010];
bool st[5010];
struct ci{
int a;
int b;
}city[5010];
int find(int x)
{
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
int main()
{
int n,m,k;
cin>>n>>m;
for(int i=0;i<n;i++)
f[i]=i;
for(int i=0;i<m;i++)
{
cin>>city[i].a>>city[i].b;
int pa=find(city[i].a),pb=find(city[i].b);
if(pa!=pb)
f[pa]=pb;
}
cin>>k;
int cnt=0;
for(int i=0;i<n;i++)
if(f[i]==i) cnt++;
for(int i=0;i<k;i++)
{
int x;
int curcnt=0;
cin>>x;
st[x]=true;
for(int i=0;i<n;i++)
f[i]=i;
for(int i=0;i<m;i++)
if(!st[city[i].a]&&!st[city[i].b])
{
int pa=find(city[i].a),pb=find(city[i].b);
if(pa!=pb)
f[pa]=pb;
}
for(int i=0;i<n;i++)
if(!st[i]&&f[i]==i)
curcnt++;
if(curcnt>cnt)
cout<<"Red Alert: City "<<x<<" is lost!"<<endl;
else
cout<<"City "<<x<<" is lost."<<endl;
cnt=curcnt;
}
if(k==n)
cout<<"Game Over."<<endl;
}