小埋学习图之图的遍历 Problem ID: 15633 TLE10

题目描述:

小埋最近在学习有向图的遍历相关知识,小埋学习过图的遍历的相关方法,可以使用dfs或者bfs来遍历整个有向图,但是小埋发现这个问题有一些不一样,这个图的遍历是问你当前点能够到达的点的最大编号,小埋希望你能帮她解决这个问题。

输入格式:

第一行两个整数一个n一个m,n代表有向图中有n个点,m代表有向图中有m条有向边。

接下来是m条边。

输出格式:

输出每个点能够到达的最大编号

样例1输入:

4 3
1 2
1 3
2 3

样例1输出:

3 3 3 4

数据范围:

1<=n,m<=100000
代码如下:

#include<bits/stdc++.h>
#pragma GCC optimize(3)
#pragma G++ optimize(3)
using namespace std;
vector<vector<int> >  a(100005);
int n,m,u,v,dv[100005];
int d(int now)
{
    if(dv[now])return 0;
    if(a[now].empty())return now;
    int ans=now;
    for(int i=0;i<a[now].size();i++)
    {
        dv[now]=1;
        ans=max(d(a[now][i]),ans);
        dv[now]=0;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {   
        cin>>u>>v;
        a[u].push_back(v);
    }
    for(int i=1;i<=n;i++)
        cout<<d(i)<<" ";
    return 0;
}
2 个赞

这题不能正序枚举 无论怎么改都是TLE10(亲身经历)
要倒着存储u和v 使所有的路径反过来
然后倒序遍历 从较大编号的节点出发 看能走到哪些节点 再将编号赋值于能走到的节点
例子:4节点3路径,1->2,1->3,2->3 ,倒着存储为2->1,3->1,3->2
从4开始,由于4没有与其他节点相连,因此q[4]=4,标记4为走过;
再3,3可以走到1、2,因此q[1、2]=3,标记1、2为走过;
由于没有比3大的节点指向3,因此q[3]=3.
答案为3 3 3 4.

1 个赞

谢谢,AC了

#pragma GCC optimize(3)
#pragma G++ optimize(3)

干吗用?

O2 优化 与 O3 优化

纯萌新,刚刚学c++

#pragma GCC optimize(3)
#pragma G++ optimize(3)

你是用c++写的,那G++不就可以了,为什么还要加上一条GCC的?

我不会开O2,我没开过O2,害怕网络暴力,刚满18岁纯情女高,柔弱敏感,爱哭,与闺蜜绝交后得了玉玉症,哈哈哈哈哈哈,我突然释怀的似了,害怕网络暴力,因为天生弱智所以每次都要坐爱心专座,说得可能不对,勿喷谢谢,非常好的O2,使我的大脑旋转