poj 1125 Stockbroker Grapevine

来源:互联网 发布:广州seo顾问 编辑:程序博客网 时间:2024/06/16 06:22
package test;

import java.util.Scanner;

/**问题请参考http://poj.org/problem?id=1125
 * @author rayli

 * @date:2014-7-27 下午2:28:53
 * 题意 :Stockbrokers要散布一个股票的谣言,谣言只能在相互认识的人中传递,
 * 给出人与人的关系(是否认识),以及传言在某两个认识的人中传递所需的时间。
 * 求出以哪个人作为散布谣言的起点,能使得所有人都受到谣言的时间最短。
 *
 *
 *输入: 第一行就是输入炒股的人的个数n
 *接下来n行
 *比如 第一行第一个数字是这个炒股的1号能通报给几个人 后面的数字是给第几号需要多少时间
 *第二行就是炒股的2号 blabla以此类推
 *注意这个传递方向是有向的...
 *求从第几号炒股的开始传信号 所需的时间最少 求出这个最短时间
 *强调一下信号能同时发出去哟,所以构建的邻接矩阵都不用怎么处理直接就能得出这个值
 */
public class StockbrokerGrapevine
{
    static int map[][];
    static int n;
    int anstime = Integer.MAX_VALUE;
    int anspeople = 0;
    
    void init()
    {
        map = new int[n+1][n+1];
        
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                map[i][j] = i << 20;
            }
    }
    
    void flody()
    {
        int d[][] = map;
        
        for(int k=1; k<=n; k++)
            for(int i=1; i<=n; i++)
                for(int j=1; j<=n; j++)
                {
                    if(map[i][j] > map[i][k] + map[k][j])
                    {
                        map[i][j] = map[i][k] + map[k][j];
                    }
                }
        
        for(int i=1; i<=n; i++)
        {
            int tmp = 0;
            
            
            for(int j=1; j<=n; j++)
            {
                if(i != j && tmp < map[i][j])
                {
                    tmp = map[i][j];
                }
            }
            
            if(anstime > tmp)
            {
                anstime = tmp;
                anspeople = i;
            }
                
        }
    }
    
    void output()
    {
        if(anstime < Integer.MAX_VALUE)
            System.out.println(anspeople + " " + anstime);
        else
            System.out.println("disjoint");
    }
    
    public static void main(String args[])
    {
        Scanner cin = new Scanner(System.in);
        
        n = cin.nextInt();//炒股人数
        
        while(n != 0)
        {
            StockbrokerGrapevine sg = new StockbrokerGrapevine();
            
            sg.init();//初始化
            
            
            for(int i=1; i<=n; i++)
            {
                int m = cin.nextInt();//能传播的人数
                while(m-->0)//这个人能传播m个人
                {
                    int c = cin.nextInt();//传播给第c个人
                    int p = cin.nextInt();//用的时间
                    
                    map[i][c] = p;
                }
            }
            
            sg.flody();
            sg.output();
            
            n = cin.nextInt();
        }
        cin.close();
    }
}
原创粉丝点击