Leetcode 1319. 连通网络的操作次数 DFS/并查集

news/2024/7/20 22:47:32 标签: leetcode, 深度优先, 算法, c++

原题链接:Leetcode 1319. 连通网络的操作次数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
并查集+路径压缩

class Solution {
public:
    map<int,int> fa;
    int findfather(int x)
    {
        int a=x;
        while(x!=fa[x])  x=fa[x];
        while(a!=fa[a])
        {
            int z=fa[a];
            a=fa[a];
            fa[z]=x;
        }
        return x;
    }
    void Union(int x,int y)
    {
        int fx=findfather(x);
        int fy=findfather(y);
        if(fx!=fy) fa[fx]=fy;

    }
    int makeConnected(int n, vector<vector<int>>& connections) {
        int num=connections.size();
        if(num<n-1) return -1;
        for(int i=0;i<n;i++) fa[i]=i;
        int res=0;
        for(auto x:connections)
        {
            int a=x[0],b=x[1];
            if(findfather(a)!=findfather(b)) 
            {
                Union(a,b);
                res++;
            }
        }
        return n-1-res;
    }
};
class Solution {
public:
    map<int,int> fa;
    set<int> father;
    int findfather(int x)
    {
        int a=x;
        while(x!=fa[x]) x=fa[x];
        while(a!=x)
        {
            int tmp=a;
            a=fa[a];
            fa[tmp]=x;
        }
        return x;
    }
    void Union(int x,int y)
    {
        int fx=findfather(x);
        int fy=findfather(y);
        if(fx!=fy) fa[fy]=fx;
    }
    int makeConnected(int n, vector<vector<int>>& connections) {
        int num=connections.size();
        if(num<n-1) return -1;
        for(int i=0;i<n;i++) fa[i]=i;
        int res=0;
        for(auto x:connections)
        {
            int a=x[0],b=x[1];
            Union(a,b);
        }
        for(int i=0;i<n;i++) father.insert(findfather(i));
        return father.size()-1;
    }
};

DFS

class Solution {
public:
    vector<int> visited;
    vector<vector<int>> adj;
    void dfs(int i)
    {
        visited[i]=1;
        for(auto x:adj[i])
        {
            if(!visited[x]) dfs(x);
        }
    }
    int makeConnected(int n, vector<vector<int>>& connections) {
        int num=connections.size();
        if(num<n-1) return -1;
        adj.resize(n);
        visited.resize(n);
        for(auto x:connections)
        {
            int i=x[0],j=x[1];
            adj[i].push_back(j);
            adj[j].push_back(i);
        }
        int res=0;
        for(int i=0;i<n;i++)
        {
            if(!visited[i])
            {
                dfs(i);
                res++;
            }
        }
        return res-1;
    }
};

http://www.niftyadmin.cn/n/1264522.html

相关文章

Leetcode 743. 网络延迟时间 DFS/BFS/Dijkstra/Dijkstra+优先队列/Floyd/Bellman-Ford

原题链接&#xff1a;Leetcode 743. 网络延迟时间 DFS class Solution { public:vector<vector<pair<int,int>>> adj;vector<int> visit;void dfs(int now,int w){if(visit[now]>w){visit[now]w;for(auto x:adj[now]){int ax.first,bx.second;df…

对于互信息的理解

转载&#xff1a;互信息&#xff08;Mutual Information&#xff09;的介绍

Leetcode 310. 最小高度树 BFS

原题链接&#xff1a;Leetcode 310. 最小高度树 超时DFS&#xff1a; class Solution { public:int res0;void dfs(vector<int>& visit,vector<vector<int>>& edges,int now,int h){visit[now]1;int flag-1;for(auto x:edges){int ax[0],bx[1];if(a…

Leetcode 841. 钥匙和房间

原题链接&#xff1a;Leetcode 841. 钥匙和房间 DFS class Solution { public:vector<int> visit;vector<vector<int>> adj;int num0;void dfs(int i){visit[i]1;num;for(auto x:adj[i]){if(!visit[x]) dfs(x);}}bool canVisitAllRooms(vector<vector<…

Leetcode 851. 喧闹和富有 DFS/拓扑排序

原题链接&#xff1a;Leetcode 851. 喧闹和富有 DFS1&#xff1a; class Solution { public:int tmpINT_MAX;int person;vector<vector<int>> adj;vector<int> visit;void dfs(vector<int>& quiet,int now){if(quiet[now]<tmp){tmpquiet[now];…

Leetcode 1042. 不邻接植花 图染色

原题链接&#xff1a;Leetcode 1042. 不邻接植花 class Solution { public:vector<int> gardenNoAdj(int n, vector<vector<int>>& paths) {vector<int> res(n1);vector<vector<int>> adj(n1);for(auto x:paths){int ax[0],bx[1];adj…

Leecode 1976. 到达目的地的方案数 Dijkstra+DP

原题链接&#xff1a;Leecode 1976. 到达目的地的方案数 参考&#xff1a;到达目的地的方案数 dijkstraDP&#xff0c;用一个cnt数组记录一下每个点到起点的最短路径的数量。 class Solution { public:vector<vector<pair<int,int>>> adj;vector<int>…

Leetcode 2316. 统计无向图中无法互相到达点对数 DFS/BFS/并查集+前缀和

原题链接&#xff1a;Leetcode 2316. 统计无向图中无法互相到达点对数 DFS class Solution { public:vector<vector<int>> adj;vector<int> visit;void dfs(int i,int color){visit[i]color;for(auto x:adj[i]){if(!visit[x]) dfs(x,color);}}long long cou…