2.28-3.2 学习记录(复习最小生成树,矩阵快速幂)

1.知识点复习:并查集,最小生成树(prime和克鲁斯卡尔)算法.
并查集

void init(int x)//初始化
{
    for(int i=1;i<=x;i++)
    {
        f[i]=i;
        rank[i]=1;
    }
 } 
int find(int x)
{
    if(x==f[x])
    return x;
    else {//路径压缩
        f[x]=find(f[x]); 
        return f[x];
    }
    /*非路径压缩
    else{
    return find(f[x]);
        }
    */
}
//按序合并 
void merge(int x,int y)
{
    int n=find(x),m=find(y);
    if(rank[n]==rank[m]) {
        f[m]=n;rank[n]++;
    }
    if(rank[n]>rank[m]){
        f[m]=n;
    }
    else f[n]=m;
}
//按序合并与路径压缩一般不一起用。
void merge1(int x,int y)
{
    int n=find(x),m=find(y);
    f[n]=m;
 } 

克鲁斯卡尔算法写最小生成树要用到并查集(数据大时一定要用路径压缩)。

prime算法模板

int prime(int n,int st)
{
    int cnt=st;
    vis[st]=1;//标记起点并记录他 
    for(int i=1;i<=n;i++)
    {
        if(i==st) dis[st]=0;
        else dis[i]=mp[i][st];
    }
    //更新dis
    for(int i=1;i<n;i++)//再找接下来的n个点 
    {
        int mini=min_n;
        for(int j=1;j<=n;j++)//找到目前未归类的最短路径连接的点
        {
            if(vis[j]==0&&mini>dis[j])
            {
                mini=dis[j];
                cnt=j;
            }
         }
        ans+=dis[cnt];
        vis[cnt]=1;
        for(int j=1;j<=n;j++)//更新路径 
        if(vis[j]==0&&dis[j]>mp[cnt][j])//以目前找到的点为起点更新dis 
            dis[j]=mp[cnt][j];
                                /*迪杰斯特拉
                                if(vis[j]==0&&dis[j]>mp[cnt][j]+dis[cnt])
                                dis[j]=mp[cnt][j]+dis[cnt];
                                */
    }
 } 

由于prime算法与迪杰斯特拉思路相似,重新写一下思路复习两个算法。将已经连接的点与未连接的点设定两个集合,用vis[ ]数组标记是否找到,vis[]=1表示找到。每次从vis[]=0的集合里找到一个距离vis[]=1集合最近的点,并更新dis[].迪杰斯特拉与prime算法的不同处就在于更新dis的操作。
用线段树完成动态最小生成树

全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
07-10 14:08
已编辑
江西农业大学 Java
念旧select:做完把项目放到自己硬盘里给他看,看完拷走
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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