题解 | #最短路径#

最短路径

https://www.nowcoder.com/practice/a29d0b5eb46b4b90bfa22aa98cf5ff17

//纯自己写的DFS,竟然一遍就成功了

#include <iostream>
#include <queue>
#include <algorithm>
#include <climits>
#include <cstring>
using namespace std;


int father[101];
int height[101];



void Initial()//每个点都作为根节点,高度都为0
{
    for(int i=0;i<101;i++)
    {
        father[i]=i;
        height[i]=0;
    }
}

int Find(int x)
{
    if(x==father[x])return x;
    return Find(father[x]);
}

void Union(int a,int b)
{
    a=Find(a);
    b=Find(b);
    if(a!=b)
    {
        if(height[a]>height[b])father[b]=a;
        else  if(height[a]<height[b])father[a]=b;
        else
         {
            father[b]=a;height[a]++;
         }
    }
}


struct Edge{
    
    int to;
    int length;
    bool operator<(const Edge& edge) const{
        return length<edge.length;
    }
    Edge(int t,int l)
    {
        to=t;
        length=l;
    }
};


bool visit[101];
vector<Edge> graph[101];

int ans;
void DFS(int f,int t,int a)
{
    if(f==t)
    {
        ans=a;
        return ;
    }

    for(int i=0;i<graph[f].size();i++)
    {
        int u=graph[f][i].to;
        int l=graph[f][i].length;
        if(visit[u])continue;
        else
         {
            visit[u]=true;
            DFS(u,t,a+l);
            visit[u]=false;
         }

    }
}




int main() {
    int n,m;
    while (cin >> n>> m) { 
        Initial();
        int d=1;
        for(int i=0;i<m;i++)
        {
            int a,b;cin>>a>>b;
            
            if(Find(a)!=Find(b))
            {
                Union(a,b);
                graph[a].push_back(Edge(b,d));
                graph[b].push_back(Edge(a,d));
            }
            d=d*2;
            d%=100000;
        }

        //已经得到最小生成树,存在了graph里,下面用DFS来找每个点的距离


        for(int i=1;i<n;i++)
        {
            if(Find(i)!=Find(0))
            {
                cout<<"-1"<<endl;
                continue;
            }
            memset(visit,false,sizeof(visit));
            visit[0]=true;

            ans=0;
            DFS(0,i,0);
            cout<<ans%100000<<endl;
            
        }
     
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
02-12 18:14
RT,这周五就是情人节了,前女友给我发了消息,我该不该回?
Yoswell:原则上来说让她滚,但是本着工作很累下班想吃瓜的心态,我觉得你可以回一下
点赞 评论 收藏
分享
02-05 08:49
已编辑
武汉大学 Web前端
野猪不是猪🐗:36k和36k之间亦有差距,ms的36k和pdd的36k不是一个概念
点赞 评论 收藏
分享
coffrar:全都是已读😅沟通一千五百多个了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务