美文网首页
模板-U9559邻接矩阵DFS遍历+Prim

模板-U9559邻接矩阵DFS遍历+Prim

作者: 余生筑 | 来源:发表于2019-03-16 09:21 被阅读0次
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<numeric>
using namespace std;
const int MAXV=1001,INF=1000001;
int N,M;
int d[MAXV];//候选边数组,d[i]为顶点i与当前树的最短距离(i与当前树的所有顶点距离的最小值)
bool vest[MAXV];//若vest[i]已并入树中,则vest[i]=true;
int G[MAXV][MAXV];//图的边权值
int sum=0,cnt=0;//最小生成树权值和
bool visit[MAXV]= {false};
void DFS(int i)
{
    visit[i]=true;
    for(int j=0; j<N; j++)
    {
        if(visit[j]==false&&G[i][j]!=INF)
            DFS(j);
    }
}
int Prim(int v)//v为起点
{
    int ans=0;//最小生成树边权之和

    //下面这一段,和Dijkstra算法一模一样
    fill(d,d+MAXV,INF);
    d[v]=0;
    for(int i=0; i<N; i++)
    {
        int u=-1,MIN=INF;
        for(int j=0; j<N; j++)
        {
            if(vest[j]==false&&d[j]<MIN)
            {
                u=j;
                MIN=d[j];
            }
        }

        if(u==-1)
            return -1;

        //从这里开始,就和Dijkstra算法不一样了
        vest[u]=true;
        ans+=d[u];

        for(int v=0; v<N; v++)
        {
            if(vest[v]==false&&G[u][v]!=INF&&G[u][v]<d[v])
                d[v]=G[u][v];
        }
    }
        return ans;
}
int main()
{
    while(cin>>N>>M)
    {
        if(N==0)
            return 0;
        fill(G[0],G[0]+MAXV*MAXV,INF);
        fill(vest,vest+MAXV,false);
        cnt=0;
        for(int i=0; i<M; i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            G[a-1][b-1]=c;
            G[b-1][a-1]=c;
        }
        for(int i=0; i<N; i++)
        {
            if(visit[i]==false)
            {
                cnt++;
                DFS(i);
            }
        }
        if(cnt>1)
            cout<<"?"<<endl;
        else
            cout<<Prim(0)<<endl;
    }
    return 0;
}

相关文章

  • 模板-U9559邻接矩阵DFS遍历+Prim

  • 各种DFS

    DFS邻接矩阵遍历图 DFS邻接表遍历图 DFS回溯(不走重复路径) DFS背包(可重复选) DFS背包(不可重复选)

  • 图的遍历

    1.采用深度优先搜索(DFS)遍历图 邻接矩阵: 邻接表: 2.采用广度优先搜索(BFS)遍历图 邻接矩阵: 邻接...

  • 图论小结

    图的存储 邻接矩阵 邻接表 图的遍历 DFS(双向DFS) BFS(剪枝) 单源最短路径算法 dij 条件:无负权...

  • 机试常用算法和题型-图专题

    图专题 并查集,寻找父节点,合并模板 图的遍历DFS邻接矩阵和邻接表法 迪杰特斯拉求最短路径长度+从某点到另一点的...

  • 数据结构-图

    图的增删改查 增 邻接表 邻接矩阵 删 改 查 图的遍历 深度优先遍历(DFS) 深度优先搜索法是树的先根遍历的推...

  • 五. 图

    图的存储 顺序表(矩阵存储) 链表(邻接链表) 图的遍历 BFS, DFS 图的最小生成树 Prim, Krusk...

  • 图的BFS以及DFS递归非递归实现

    本文所使用的所有邻接表以及邻接矩阵定义均在之前博客,这里不再赘述 一、深度优先遍历DFS(Depth-first ...

  • 数据结构与算法-最小生成树

    个人来看,Prim算法、Kruskal算法都可以算贪婪算法。 0. 数据结构 采用邻接矩阵实现。 1. Prim算...

  • 模板-邻接表DFS遍历

网友评论

      本文标题:模板-U9559邻接矩阵DFS遍历+Prim

      本文链接:https://www.haomeiwen.com/subject/ldjjmqtx.html