Problem: Zju1082 谣言的传播
Time Limit: 1 Sec Memory Limit: 128 MB[ Submit][ Status][ Web Board]
Description
China历史最伟大的SPY金无怠潜入了美国的FBI,为了整掉这个罪恶的机构,他决定在FBI散布假消息。他首先选定FBI中的某一个职员,将谣言告诉他,然后这个人会将消息再告诉给每一个他认识的人,当然在这个过程中需要花费一定的时候。然后这些人又会把消息告诉给每一个他所认识的人。这样消息就可能传遍整个FBI,当然每个人知道这个消息的时间有先有后。我们希望最晚才知道这个消息的人他所需要的时间越短越好(设这个时间长度为T)。那么金无怠应该选择哪一个人做为消息的首发者呢?请输出这个人的编号及T。如果消息不能传遍FBI请输出"disjoint"
注意从职员A传播谣言给职员B的时间不一定等于从职员B传播谣言给职员A的时间。
注意从职员A传播谣言给职员B的时间不一定等于从职员B传播谣言给职员A的时间。
Input
先给出FBI中有多少个职员,用数字N(N<=100)来代表。
接下来N行,用来描述这N个职员。
每一行给出这个职员他认识几个人,然后给出所认识的职员的编号及传消息给他所要花的时间.
接下来N行,用来描述这N个职员。
每一行给出这个职员他认识几个人,然后给出所认识的职员的编号及传消息给他所要花的时间.
Output
如题
Sample Input
3
2 2 4 3 5
2 1 2 3 6
2 1 2 2 2
Sample Output
3 2
HINT
#include<stdio.h>
#include<string.h>
#define INF 0x7fffffff
class rumour {
public:
int v[101][101],d[101][101],t[101],n,m;
void init() {
memset(v,0x3f,sizeof(v));
scanf("%d",&n);
for(i=1; i<=n; i++) {
scanf("%d",&N);
for(j=1; j<=N; j++) {
scanf("%d %d",&x,&y);
v[i][x]=y;
}
}
}
void work() {
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++) {
if(v[i][k]+v[k][j]<v[i][j])
v[i][j]=v[i][k]+v[k][j];
}
}
void print() {
for(i=1; i<=n; i++) {
int maxx=0;
for(k=1; k<=n; k++)
if(v[i][k]>maxx&&i!=k)
maxx=v[i][k];
if(maxx<minn) minn=maxx,sum=i;
}
minn==INF?printf("disjoint"):printf("%d %d",sum,minn);
}
private:
int i,j,k,x,y,N,minn=INF,sum;
};
int main() {
rumour FBI;
FBI.init();
FBI.work();
FBI.print();
}