DS实验题 Floyd最短路径 & Prim最小生成树

题目:

885822-20161124184119628-608000056.png

提示:
885822-20161124184159971-388352057.png

Floyd最短路径算法实现(未测试):

//  
//  main.cpp  
//  Alg_Floyd_playgame  
//  
//  Created by wasdns on 16/11/19.  
//  Copyright ? 2016年 wasdns. All rights reserved.  
//  
  
#include <iostream>  
#include <cstdio>  
#include <cstdlib>  
#include <string>  
#include <string.h>  
using namespace std;  
  
#define endless 1000000001;  
  
int Floydgh[5005][5005];  
  
void Inigh(int n)  
{  
    for (int i = 1; i <= n; i++)  
    {  
        Floydgh[i][i] = 0;  
          
        for (int j = 1; j <= n; j++)  
        {  
            if (i != j) {  
                Floydgh[i][j] = endless;  
            }  
        }  
    }  
}  
  
void Creatgh(int n, int m)  
{  
    Inigh(n);  
      
    int i, u, v, w;  
      
    for (i = 1; i <= m; i++)  
    {  
        cin >> u >> v >> w;  
          
        Floydgh[u][v] = w;  
        Floydgh[v][u] = w;  
    }  
}  
  
void Alg_Floyd(int n)  
{  
    int i, j, k;  
      
    for (k = 1; k <= n; k++)  
    {  
        for (i = 1; i <= n; i++)  
        {  
            for (j = 1; j <= n; j++)  
            {  
                int t = Floydgh[i][k] + Floydgh[k][j];  
                  
                if (t < Floydgh[i][j]) {  
                    Floydgh[i][j] = t;  
                    Floydgh[j][i] = t;  
                }  
            }  
        }  
    }  
}  
  
int minjudge(int n)  
{  
    int i, j;  
      
    int minlen = endless;  
      
    for (i = 1; i <= n; i++)  
    {  
        int cnt = 0;  
          
        for (j = 1; j <= n; j++)  
        {  
            cnt += Floydgh[i][j];  
        }  
          
        if (cnt < minlen) {  
            minlen = cnt;  
        }  
    }  
      
    return minlen;  
}  
  
int main()  
{  
    int n, m;  
      
    cin >> n >> m;  
      
    Creatgh(n, m);  
      
    Alg_Floyd(n);  
      
    cout << minjudge(n) << endl;  
      
    return 0;  
} 

Prim生成树算法实现:

关于Prim算法,请参考我的另外一篇博客:hdoj-1233-还是畅通工程


//
//  main.cpp
//  Prim
//
//  Created by wasdns on 16/11/24.
//  Copyright © 2016年 wasdns. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <string.h>
#define maxn 10000005;
using namespace std;

int Primgh[10000][10000];

bool refer[10005];

void Initial(int n, int m)
{
    int i, j;
    
    for (i = 1; i <= n; i++)
    {
        refer[i] = false;
        
        for (j = 1; j <= n; j++)
        {
            if (i == j) {
                Primgh[i][j] = 0;
            }
            
            else Primgh[i][j] = maxn;
        }
    }
    
    int u, v, w;
    
    for (i = 1; i <= m; i++)
    {
        cin >> u >> v >> w;
        
        Primgh[u][v] = w;
        Primgh[v][u] = w;
    }
}

int Prim_Alg(int n, int m)
{
    Initial(n, m);
    
    int i, j, k;
    
    int ans = 0;
    
    refer[1] = true;                    //起点为1
    
    for (i = 1; i <= n-1; i++)
    {
        int minlen = maxn;
        
        int rcd = 1;
        
        for (j = 1; j <= n; j++)
        {
            if (!refer[j]) continue;
            
            int len1 = maxn;
            int rcd1 = 1;
            
            for (k = 1; k <= n; k++)
            {
                if (!refer[k])
                {
                    if (Primgh[j][k] < len1) {
                        
                        len1 = Primgh[j][k];
                        
                        rcd1 = k;
                    }
                }
            }
            
            if (len1 < minlen) {
                
                minlen = len1;
                
                rcd = rcd1;
            }
        }
        
        //char check = 'A'+rcd-1;
        //cout << "rcd: " << check << endl;
        //cout << "minlen: " << minlen << endl;
        
        refer[rcd] = true;
        rcd = 1;
        
        ans += minlen;
    }
    
    return ans;
}

int main()
{
    int n, m;
    
    cin >> n >> m;
    
    cout << Prim_Alg(n, m) << endl;
    
    return 0;
}

测试样例:

/*
 eg1. 
 
 Input:
 4 6
 1 2 1
 2 3 2
 1 3 3
 2 4 3
 3 4 5
 1 4 4
 
 Output:
 6
 
 eg2.
 
 Input:
 7 11
 1 2 7
 1 4 5
 2 4 9
 2 3 8
 2 5 7
 3 5 5
 4 5 15
 4 6 6
 5 6 8
 5 7 9
 6 7 11
 
 Output:
 39
 */

2016/11/24

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值