I-ウォークオブスリー(dfs)

I-ウォークオブスリー

タイトル説明

Vasyaが住んでいる都市には、mmのパスで接続されたnnの芝生がある公園があります。それぞれの道に沿って両方向に歩くことができます。パスで接続された芝生はネイバーと呼ばれます。

公園の入り口は、入り口の芝生と呼ばれる芝生番号1の近くにあります。ヴァシャの両親は彼の安全を非常に心配しているので、彼らは彼が入り口の芝生の隣にある芝生でのみ遊ぶことを許可しています。入り口の芝生は通常混雑しているため、Vasyaは芝生で遊ぶことができません。

Vasyaは、隣の芝生への道を単に歩くのは退屈だと感じています。代わりに、彼は入り口の芝生から始めて、正確に3つの異なる道を歩きます。その後、彼は芝生で遊んで散歩を終えます。ヴァシャは両親が定めた規則に違反しないので、いつも入り口の芝生に隣接する芝生の上を散歩を終えます。

ヴァシャは毎日、今までに行ったことのない新しい散歩を選びたいと思っています。彼が入り口の芝生で旅を始める方法がいくつあるかを判断し、正確に3つの異なる道をたどり、入り口の芝生に隣接する芝生にいることに気付くのを手伝ってください。

入力入力
の最初の行には、2つの整数nnとmmが含まれています—それぞれ芝生の数とパスの数(1≤n≤1000001≤n≤100000、1≤m≤2000001≤m≤200000)。

次のmmの線には、パスで接続された芝生のペアが含まれています。2つの芝生は、1つのパスで接続されます。芝生とそれ自体をつなぐ道はありません。

出力
Vasyaが取ることができる歩行の数を出力します。

実施例の
入力
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
出力
4
入力
3 3
1 2
2 3
3 1
出力
0

トピック

最後に到達したポイントが開始点または最後に直接開始点に到達できるように、開始点(1)から3つの異なるパスを連続して歩く必要があります。

ACコード

この質問は、わずかに変更されたdfsの直接TLEであり、時間はACです。
それは再び剪定されるべきです、私は大物がコメントして、ポインターを与えることができることを望みます。

#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;
}

おすすめ

転載: blog.csdn.net/rookie636/article/details/111240443