Problem: Zju1082 谣言的传播

Problem: Zju1082 谣言的传播

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的时间。

Input

先给出FBI中有多少个职员,用数字N(N<=100)来代表。
接下来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

[Submit][Status]
#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();
}
posted @ 2019-03-29 22:38  ZhaoChongyan  阅读(137)  评论(0编辑  收藏  举报