连通块

邻接矩阵表示的图:
油田
dfs

#include<bits/stdc++.h>
using namespace std;

const int maxn=104;
char G[maxn][maxn];
int n,m;
int ans=0;

int x[8]={0,0,-1,1,1,1,-1,-1};
int y[8]={-1,1,0,0,-1,1,1,-1};
int flag[maxn][maxn];
void dfs(int h,int l)
{
    for(int i=0;i<8;i++)
    {
        int yy=h+y[i];
        int xx=l+x[i];
        if(yy>=1 && yy<=n && xx>=1 &&xx<=m && !flag[yy][xx] && G[yy][xx]=='@'){
                flag[yy][xx]=1;
                dfs(yy,xx);
        }
    }
}
int main()
{
    while(cin>>n>>m && n+m)
    {
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>G[i][j];
            }
        }
        memset(flag,0,sizeof(flag));
        int cnt =0;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            if( !flag[i][j] ){
                  flag[i][j]=1;
                if(G[i][j]=='@'){
                     cnt++;
                     dfs(i,j);
                }
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

bfs

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f

const int maxn=120;
struct Node{
    int  x,y;
};
int flag[maxn][maxn];
char G[maxn][maxn];
queue<struct Node> Q;
int y[8]={0,0,-1,1,1,1,-1,-1};  //列
int x[8]={-1,1,0,0,-1,1,1,-1};  //行
int n,m;
int cnt=0;
void bfs(int wx,int wy)
{
    Node f;
    f.x=wx; f.y=wy;
    Q.push(f);
    while(Q.size())
    {
        Node now=Q.front();
        Q.pop();
        int nowx=now.x;
        int nowy=now.y;
        for(int i=0;i<8;i++){
            int xx=nowx +x[i];
            int yy=nowy +y[i];
            if(G[xx][yy]=='@' && !flag[xx][yy]){
                flag[xx][yy]=1;
                Node wait;
                wait.x=xx;  wait.y=yy;
                Q.push(wait);
            }
        }
    }


}
int main()
{
    while(cin>>n>>m && n+m)
    {
        memset(flag,0,sizeof(flag));
        cnt=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>G[i][j];

        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(!flag[i][j]){
                    flag[i][j]=1;
                    if(G[i][j]=='@'){
                        cnt++;
                        bfs(i,j);
                    }
                }
            }
        }
        cout<<cnt<<endl;
    }

    return 0;
}

邻接表表示的图:vector存图
搭配购买

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f

const int maxn=1e4+100;
vector<int> G[maxn];
int n,m;
int flag[maxn];
int c[maxn],w[maxn];
int C[maxn],W[maxn];
int dp[maxn*2];
int V;
int cnt=0;
void dfs(int u,int bj)
{
    for(auto it: G[u]){
        int v=it;
        if(!flag[v]){
            flag[v]=1;
            C[bj]+=c[v];
            W[bj]+=w[v];
            dfs(v,bj);
        }
    }
}
int main()
{
    cin>>n>>m>>V;
    for(int i=1;i<=n;i++){
        cin>>c[i]>>w[i];
    }
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        if(!flag[i]){
            flag[i]=1;
            C[++cnt]+=c[i];
            W[cnt]+=w[i];
            dfs(i,cnt);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=V;j>=C[i];j--)
            dp[j]=max(dp[j],dp[j-C[i]]+W[i]);

    }
    cout<<dp[V]<<endl;

    return 0;
}

思想:总的来说是渲染整张图。
main函数里扫图。
连通块也是这时候统计的
细节:dfs时注意,if(x 满足条件) dfs(x)

 
posted @ 2021-04-28 20:55  DuJunlong  阅读(13)  评论(0编辑  收藏  举报  来源