连通分量
最大路径和
一定用dfs,如下图当所有方向都可以走的时候bfs并不能完整的一整条因为同时打的标1-2 1-3 标志2-3不可能 万一这是最大路径?
探险家的题目用0隔开给你一种可以输出完整一条的错觉
image
#include <bits/stdc++.h>
using namespace std;
int ans=0;
int g[105][105];int n,m;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
void dfs(int x,int y,int w)//我们这里定义到达这里的时侯的路径和
{
ans=max(ans,w);//找所有路径-所有点的最大
for(int i=0;i<4;i++)
{
int nx=x+dx[i];int ny=y+dy[i];int nw=w+g[nx][ny];
if(nx<0 ||nx>=n||ny<0||ny>=m) continue;
if(g[nx][ny]==0) continue;
int tt=g[nx][ny];
g[nx][ny]=0;
dfs(nx,ny,nw);
g[nx][ny]=tt;
}
}
int main()
{
while(cin>>n>>m)
{
ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>g[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(g[i][j]!=0)
{
int tt=g[i][j];
g[i][j]=0;
dfs(i,j,tt);//修改了
g[i][j]=tt;
}
}
}
cout<<ans<<endl;
}
}
不对的bfs牢记
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y,v;
};
int ans=0;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,m;
int visited[105][105];
int g[105][105];
void bfs(int x,int y,int v)
{
queue<node>pq;
pq.push({x,y,v});
while(!pq.empty())
{
auto it=pq.front();
pq.pop();
int cx=it.x;int cy=it.y;int cv=it.v;
ans=max(ans,cv);
for(int i=0;i<4;i++)
{
int nx=cx+dx[i];int ny=cy+dy[i];
if(nx<0||nx>=n||ny<0||ny>=m) continue;
if(g[nx][ny]==0)continue;
if(visited[nx][ny]) continue;
int nv=cv+g[nx][ny];
visited[nx][ny]=1;
pq.push({nx,ny,nv});
}
}
}
int main()
{
while(cin>>n>>m)
{
ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>g[i][j];
}
}
int num=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(g[i][j]!=0)
{
meset(visited,0,sizeof(visited));
visited[i][j]=1;
bfs(i,j,g[i][j]);
}
}
}
cout<<ans<<endl;
}
}
联通个数
所有联通点的个数和求和都是可以用bfs dfs的
#include <bits/stdc++.h>
using namespace std;
int dx[8]={1,-1,0,0,1,1,-1,-1};
int dy[8]={0,0,1,-1,1,-1,-1,1};
int n,m;
char g[105][105];
void bfs(int sx,int sy)
{
queue<pair<int,int> >pq;
pq.push({sx,sy});
while(!pq.empty())
{
auto it=pq.front();
pq.pop();
int x=it.first;int y=it.second;
cout<<x<<" "<<y<<endl;
for(int i=0;i<8;i++)
{
int nx=x+dx[i];int ny=y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m)//这个=我真找了半天
{
if(g[nx][ny]=='@')
{
g[nx][ny]='*';
pq.push({nx,ny});
}
}
}
}
}
int main()
{
while(cin>>n>>m)
{
int cc=0;
for(int i=0;i<n;i++)
{
scanf("%s",g[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(g[i][j]=='@')
{
g[i][j]='*';
bfs(i,j);
cc++;
}
}
}
cout<<cc<<endl;
}
}

浙公网安备 33010602011771号