POJ 1125 Floyd


 题目大意:     直接用 输入示例说明吧,  
3
2 2 4 3 5
2 1 2 3 6
2 1 2 2 2    表示 第一行表示一个股票经纪人需要向三个人传消息,第二行表示 第一个人有两个朋友, 向第二个朋友传消息需要 时间4 ,向第三个朋友发消息需要时间 5,第二行表示 第二个人有两个朋友,向第一个人传消息需要时间2,向第三个人传消息需要时间 6,第三行同样。
     求 能够 向所有人都传到消息并且需要的时间最短的人,以及 这个人向某个人传消息所花的最多的时间。 
    输出  3 2 。 即表示 让第三个人传消息 所需的时间最短, 他 向其他人传消息最多的一次用了 时间2。
    如果没有人可以 向所有人传递消息,输出 disjoint  
   解题思路: Floyd 算法。 即穷举断点 ,不断更新两点之间的 最小 距离。
                   装态转移方程 map[i,j]:=min{map[i,k]+map[k,j],map[i,j]}        。k表示 穷举得断点。
#include <stdio.h>  
#define INF 100000 //无穷大  
  
int num, a[101][101];  
  
void Floyd() //Floyd算法求最短路径  
{  
    int i, j, k;  
  
    //特别注意:循环的k,i,j的顺序不能改变。我测试过把顺序改为i,j,k就错了。  
    for (k=1; k<=num; k++)  
        for (i=1; i<=num; i++)  
            for (j=1; j<=num; j++)  
                if (a[i][k]+a[k][j] < a[i][j])  
                    a[i][j] = a[i][k] + a[k][j];  
    return;  
}  
  
int main()  
{  
    int i, j;  
    int m, contact, time, minTime, sum, max,person;  
  
    while (scanf("%d", &num) && num)  
    {  
        for (i=1; i<=num; i++)  
            for (j=1; j<=num; j++)  
            {  
                if (i != j) a[i][j] = INF;  
                else        a[i][j] = 0;  
            }  
        for (i=1; i<=num; i++)  
        {  
            scanf("%d", &m);  
            for (j=1; j<=m; j++)  
            {  
                scanf("%d %d", &contact, &time);  
                a[i][contact] = time;  
            }  
        }  
  
        Floyd(); //调用Floyd函数  
        minTime = INF;  
        for (i=1; i<=num; i++)  
        {  
            sum = 0;
            int tmax=0;  
            for (j=1; j<=num; j++)  
            {  
                sum+=a[i][j];
                if(a[i][j]>tmax)
                   tmax=a[i][j];
                //if(sum>=INF) break;
            }  
            if (sum < minTime)  
            {  
                minTime = sum;  
                person = i; 
                max=tmax; 
            }  
        }  
        if (minTime != INF)   printf("%d %d\n", person, max);  
        else                  printf("disjoint\n");  
    }  
    return 0;
}  

1) { JOptionPane.showMessageDialog(this, "请选择要删除的图书!", "提示", JOptionPane.WARNING_MESSAGE); } else { 这是一道经典的最短路问题,可以使用Dijkstra算法或者Floyd算法来解决。 D String bookId = bookInfoTable.getValueAt(selectedRow, 0).toString(); int option = JOptionPane.showConfirmDialog(this, "确定要删除编号为 " + bookId + " 的图书吗?", "提示", JOptionPane.YES_NO_OPTION); if (optionijkstra算法的基本思想是从起点开始,依次遍历所有节点,每次选择距离起点最 == JOptionPane.YES_OPTION) { deleteBookInfo(bookId); loadBookInfo(); } } } else if (e.getSource() == backButton) { new MainFrame(); setVisible(false); } } private void loadBookInfo() { 近的节点进行松弛操作,直到到达终点或者所有节点都被遍历完。 Floyd算法则 tableModel.setRowCount(0); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { 是通过动态规划求解所有节点之间的最短路径。具体来说,利用一个二维数组存 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/book_management?useSSL=false&serverTimezone=UTC", "root", "root"); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM book_info"); while (rs.next())储任意两个节点之间的最短距离,然后依次考虑增加中间节点,更新所有节点 { Object[] rowData = new Object[6]; rowData[0] = rs.getInt("book_id"); rowData[1]之间的距离,直到所有节点都被考虑过。 无论使用哪种算法,都需要先构建 = rs.getString("book_name"); rowData[2] = rs.getString("author"); rowData[3] = rs.getString("publisher"); rowData[4] = rs.getDouble("price"); rowData[5] = rs.getInt("quantity"); tableModel.addRow(row出图的邻接矩阵或邻接表,然后根据算法的要求进行处理即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值