I - Caminhada dos Três (dfs)

I - Caminhada de Três

Descrição do título

A cidade onde Vasya mora tem um parque com nn gramados conectados por caminhos mm. Pode-se caminhar em ambas as direções ao longo de cada caminho. Os gramados conectados pelo caminho são chamados de vizinhos.

A entrada do parque fica próxima ao gramado número um que será chamado de gramado da entrada. Os pais de Vasya estão muito preocupados com sua segurança, então eles permitem que ele brinque apenas no gramado vizinho ao gramado da entrada. O gramado da entrada geralmente está superlotado, então Vasya não pode brincar nele.

Vasya acha enfadonho simplesmente caminhar ao longo do caminho até o gramado vizinho. Em vez disso, ele começa no gramado da entrada e caminha por exatamente três caminhos diferentes. Depois disso, ele brinca no gramado onde termina sua caminhada. Vasya não quebra as regras estabelecidas pelos pais, então ele sempre termina sua caminhada no gramado vizinho ao gramado da entrada.

Todos os dias, Vasya deseja escolher um novo passeio que não tenha feito antes. Ajude-o a determinar de quantas maneiras começar sua jornada no gramado da entrada, siga exatamente três caminhos diferentes e encontre-se no gramado vizinho ao gramado da entrada.

Entrada
A primeira linha de entrada contém dois inteiros nn e mm - o número de gramados e o número de caminhos, respectivamente (1≤n≤1000001≤n≤100000, 1≤m≤2000001≤m≤200000).

As próximas linhas de mm contêm pares de gramados conectados por caminhos. Quaisquer dois gramados estão conectados por, no máximo, um caminho. Não há caminhos ligando um gramado a ele mesmo.

Saída
Imprime o número de caminhadas que Vasya pode fazer.

Exemplos
Entrada
10 14
1 5
2 5
5 6
2 3
1 3
2 4
4 6
1 6
1 7
7 8
8 1
1 10
9 10
9 8
Saída
4
Entrada
3 3
1 2
2 3
3 1
Saída
0

Tema

Uma pessoa tem que percorrer três caminhos diferentes em sucessão desde o ponto de partida (1) para garantir que o último ponto alcançado pode chegar ao ponto de partida ou o ponto de partida diretamente no final.

Código AC

Esta questão é diretamente TLE no dfs, e é ligeiramente modificada, e a hora é AC.
Deve ser podado novamente, espero que os marmanjos possam comentar e dar dicas.

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int sum,n,m;
int vis[101000]= {
    
    0};
int dis[101000]= {
    
    0};
vector<int>a[100010];
void dfs(int x,int cnt)
{
    
    
    vis[x]=1;
    if(cnt==3)
    {
    
    
        if(dis[x]==1)sum++;
        return ;
    }
    int len=a[x].size();
    for(int i=0; i<len; i++)
    {
    
    
        if(!vis[a[x][i]])
        {
    
    
            cnt++;
            dfs(a[x][i],cnt);
            cnt--;
            vis[a[x][i]]=0;
        }
    }
}
int main()
{
    
    
    scanf("%d %d",&n,&m);
    for(int i=0; i<m; i++)
    {
    
    
        int u,v;
        scanf("%d %d",&u,&v);
        if(u==1)dis[v]=1;
        if(v==1)dis[u]=1;
        a[u].push_back(v);
        a[v].push_back(u);
    }
    sum=0;
    dfs(1,0);
    cout<<sum<<endl;
    return 0;
}

Acho que você gosta

Origin blog.csdn.net/rookie636/article/details/111240443
Recomendado
Clasificación