Subway

dfs找环的那个代码写的很烂= - =思路挺简单的,你找到环然后bfs一下就完事了

#include <bits/stdc++.h>
using namespace std;
const int N=3e3+5;
vector<int>v[N];
vector<int>cle;//存环上的点.
int dis[N];
int vis[N];
int flag=0,f=1;
void dfs(int u,int fa)
{
    if(flag) return;
    for(int i=0;i<v[u].size();i++)
    {
        int x=v[u][i];
        if(x==fa) continue;
        if(vis[x]&&!flag) { flag=x;cle.push_back(u); return;}
        vis[x]=1;
        dfs(x,u);
    }
    if(u!=flag&&flag&&f) {cle.push_back(u);}
    if(u==flag) { cle.push_back(u);f=0; }
}
queue<int>q;
void bfs()
{
    while(q.size())
    {
        int temp=q.front();
        q.pop();
        for(int i=0;i<v[temp].size();i++)
        {
            int x=v[temp][i];
            if(dis[x]!=-1) continue;
            dis[x]=dis[temp]+1;
            q.push(x);
        }
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    vis[1]=1;
    dfs(1,0);//cout<<flag<<endl;
    memset(dis,-1,sizeof dis);
    //for(int i=0;i<cle.size();i++) cout<<cle[i]<<endl;
    for(int i=0;i<cle.size();i++)
    {
        q.push(cle[i]);
        dis[cle[i]]=0;
    }
    bfs();
    for(int i=1;i<=n;i++) printf("%d ",dis[i]);
    puts("");
    return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论

相关推荐

03-26 13:04
已编辑
电子科技大学 算法工程师
xiaowl:你这个简历“条目上”都比较有深度性,但是实际上面试官又没法很好的评估你是怎么达到很多看上去很厉害的结果的。要避免一些看上去很厉害的包装,比如高效的内存复用策略的表达,如果仅是简单的一些内存共享机制,而且面试上也没有深挖的空间,就不要这样表达。比如,工程化模式本质上可能就是定义了一些abstract class,那也就没特别多值得讲的内容。建议简历上应该侧重那些你花了大量时间和精力解决、研究的问题,不要过分追求“丰富”,而是关注在技术深入度、问题解决能力的表现上。
没有实习经历,还有机会进...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务