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();
}
}
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();
}
}