题目有点难理解啊。
就是说搞股票的都对传闻比较敏感,然后有人雇佣你在股票经纪人之间散步虚假信息。从而使你的雇主在市场中收益。
有一个条件是每个股票经纪人都只相信他们的信息源的信息。意味着当你散步虚假传闻的时候必须考虑他们之间的联系圈子。而且每一个股票经纪人将虚假消息告诉他圈子里的人需要一定的时间。然后让你选一个经纪人作为目标(首先将传闻散步给他可以达到最小时间),告诉他谣言,计算他的圈子中都受到谣言所需要的时间。
输入包括多个测试数据。每个测试数据都描述了一个经纪人的圈子。
每个测试数据的第一行为一个整数n,表示经纪人的数目。编号1~n。下面n行每行描述一个经纪人,首先是一个整数m,表示这个经纪人与其他m个经纪人有联系。然后有m对整数(a,t)表示改经纪人可以把传闻传给a经纪人,所花费的时间为t
对于输出首先是第一个经纪人的编号(首先选定这个经纪人进行传闻散布,可以到达最少的时间),以及所有经济人都收到传闻的时间。对于经济人网络不是连通的输出“disjoint”。
题目的描述有点抽象。。其实就是找一个点,然后要使得这个点到其他点的最大时间要最小。
我的做法是用floyd求出所有点之间的最小时间。
然后对G进行遍历,找到满足上面条件的点。
Source Code
Problem: 1125 User: wukuan
Memory: 280K Time: 0MS
Language: C++ Result: Accepted
Source Code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 110;
const int INF = 0x3f3f3f3f;
int Graph[N][N];
int main()
{
int n;
while(scanf("%d",&n) && n)
{
memset(Graph,0x3f,sizeof(Graph));
for(int i = 1 ; i <= n ; i++)
{
Graph[i][i] = 0;
}
int m,a,t;
for(int i = 1 ; i <= n ; i++)
{
scanf("%d",&m);
for(int j = 0 ; j < m ; j++)
{
scanf("%d %d",&a,&t);
Graph[i][a] = t;
}
}
for(int k = 1 ; k <= n ; k++)
{
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= n ; j++)
{
if(Graph[i][j] > Graph[i][k] + Graph[k][j])
{
Graph[i][j] = Graph[i][k] + Graph[k][j];
}
}
}
}
int minx = INF;
int kcase;
for(int i = 1 ; i <= n ; i++)
{
int maxx = -1;
for(int j = 1 ; j <= n ; j++)
{
if(Graph[i][j] > maxx)
{
maxx = Graph[i][j];
}
}
if(maxx < minx)
{
minx = maxx;
kcase = i;
}
}
if(minx == INF)
{
cout<<"disjoint"<<endl;
}
else
{
cout<<kcase<<" "<<minx<<endl;
}
}
return 0;
}