警示后人(如果你WA#7和#22)
查看原帖
警示后人(如果你WA#7和#22)
672778
lzy_AC7楼主2023/10/15 18:36

俩个代码仅仅dfs中vis数组位置不同

区别只是已遍历的节点只是入队但随即又出对了

为什么不对我也不理解

前者WA#7和#22

后者AC

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

typedef long long ll;
const int N = 2507,M = 2e4+9;

int n,m,k;
ll a[N],ans;

int h[N],ne[M],ver[M],idx;
void add(int u,int v)
{
    ver[++idx] = v,ne[idx] = h[u],h[u] = idx;
}


bool ok[N][N],vis[N];
int dis[N];
vector<int>f[N];


void bfs(int x)
{
    queue<int>q;
    memset(vis,0,sizeof vis);
    memset(dis,0,sizeof dis);
    q.push(x);
    while(!q.empty())
    {
        int u = q.front();q.pop();
        if(vis[u])continue;
        vis[u] = 1;
        if(u != x)
        {
            ok[x][u] = 1;
            if(ok[1][u])
            {
                f[x].push_back(u);
                sort(f[x].begin(),f[x].end(),[](int x,int y){return a[x] > a[y];});
                if(f[x].size() > 3)f[x].pop_back();
            }
            
        }

        if(dis[u] < k)
        {
            for(int i = h[u];i;i = ne[i])
            {
                int v = ver[i];
                dis[v] = dis[u]+1;
                q.push(v);
            }
        }
    }
}



int main()
{
    scanf("%d%d%d",&n,&m,&k);
    k++;
    for(int i = 2;i <= n;i++)scanf("%lld",a+i);
    for(int i = 1;i <= m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v),add(v,u);
    }

    for(int i = 1;i <= n;i++)
        bfs(i);

    for(int i = 2;i <= n;i++)
        for(int j = i+1;j <= n;j++)
            if(ok[i][j])
            {
                for(int x:f[i])
                    for(int y:f[j])
                        if(x != y && x != j && y != i)
                            ans = ans<a[i]+a[j]+a[x]+a[y] ? a[i]+a[j]+a[x]+a[y] : ans;
            }

    printf("%lld",ans);

    return 0;
}

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

typedef long long ll;
const int N = 2507,M = 2e4+9;

int n,m,k;
ll a[N],ans;

int h[N],ne[M],ver[M],idx;
void add(int u,int v)
{
    ver[++idx] = v,ne[idx] = h[u],h[u] = idx;
}


bool ok[N][N],vis[N];
int dis[N];
vector<int>f[N];


void bfs(int x)
{
    queue<int>q;
    memset(vis,0,sizeof vis);
    memset(dis,0,sizeof dis);
    q.push(x);
    vis[x] = 1;
    while(!q.empty())
    {
        int u = q.front();q.pop();
        if(u != x)
        {
            ok[x][u] = 1;
            if(ok[1][u])
            {
                f[x].push_back(u);
                sort(f[x].begin(),f[x].end(),[](int x,int y){return a[x] > a[y];});
                if(f[x].size() > 3)f[x].pop_back();
            }
            
        }

        if(dis[u] < k)
        {
            for(int i = h[u];i;i = ne[i])
            {
                int v = ver[i];
                if(vis[v])continue;
                vis[v] = 1;
                dis[v] = dis[u]+1;
                q.push(v);
            }
        }
    }
}



int main()
{
    scanf("%d%d%d",&n,&m,&k);
    k++;
    for(int i = 2;i <= n;i++)scanf("%lld",a+i);
    for(int i = 1;i <= m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v),add(v,u);
    }

    for(int i = 1;i <= n;i++)
        bfs(i);

    for(int i = 2;i <= n;i++)
        for(int j = i+1;j <= n;j++)
            if(ok[i][j])
            {
                for(int x:f[i])
                    for(int y:f[j])
                        if(x != y && x != j && y != i)
                            ans = ans<a[i]+a[j]+a[x]+a[y] ? a[i]+a[j]+a[x]+a[y] : ans;
            }

    printf("%lld",ans);

    return 0;
}
2023/10/15 18:36
加载中...