説明
株式仲買人は、噂に過剰に反応することが知られています。あなたは、あなたの雇用者の株式市場での戦術的なエッジを与えるために株式仲買人の間で偽情報を拡散する方法を開発するために契約されています。最大の効果を得るために、あなたは、最速の方法で噂を広めるために持っています。
残念ながらあなたのために、株式仲買人が唯一の彼らの「信頼できるソース」から来る情報を信頼これは噂を開始するときに考慮に自分の連絡先の構造を取らなければならないことを意味します。それは彼の同僚のそれぞれに上の噂を渡すために、特定の株式仲買人のために一定の時間を要します。あなたの仕事は、株式仲買人噂のための出発点として選択するように指示するプログラムと同様に、噂は、株式仲買人のコミュニティ全体に広がるすることがかかる時間を書くことになります。この期間は、情報を受信するための最後の人のために必要な時間として測定されます。
入力
あなたのプログラムは、株式ブローカーの異なるセットのための入力データをでしょう。各セットには、株式ブローカーの番号の行で始まります。これは、これらの人々があり、彼らはとの接触を持っている人の数、およびそれぞれの人にメッセージを渡すために彼らのために要した時間を含む各株式仲買人のためのラインで次のよう。次のように各株式仲買人ラインの形式は:行は、整数nのペア、各コンタクトに対して1つのペアが続くコンタクトの数(n)は、で始まります。その人にメッセージを渡すために取ら分の時間、続いてコンタクトを参照すると、最初の番号(例えば、「1」がセットに個人番号1を意味する)、各対のリスト。特別な句読点または間隔の規則はありません。
一人一人が株式ブローカーの数に至るまで1に番号が付けられています。上にメッセージを渡すためにかかる時間は(含む)1と10分の間となり、接点の数は、株式仲買人の数よりも0と1の間少ない範囲であろう。株式仲買人の数は、入力が0(ゼロ)人々を含む株式仲買人のセットによって終了される1から100の範囲であろう。
出力
データの各セットのために、あなたのプログラムを出力しなければならない単一最速のメッセージ送信になり、人を含む行、およびどのくらいあなたがこの人にそれを与えるした後、最後の人は、任意のメッセージを受信する前には、整数分単位で測定します。
あなたのプログラムが一部の人々が到達不能かもしれすなわち、一部の人を除いた接続のネットワークを受け取ることも可能です。あなたのプログラムは、切断されたネットワークを検出した場合は、単に出力メッセージ「互いに素」。人物Bに人物Aからのメッセージを通過するのにかかる時間は、必ずしもそのような伝送が全く可能である場合、BからAに渡すのにかかる時間と同じではないことに留意されたいです。
サンプル入力
3
2 2 4 3 5
2 1 2 3 6
2 1 2 2 2
5
3 4 4 2 8 5 3
1 5 8
4 1 6 4 10 2 7 5 2
0
2 2 5 1 5
0
サンプル出力
3 2
3 10
タイトル効果:点との最短距離の他のポイントを見つけるためにすべての点が、有向グラフ与えられ、最小点に番号を出力し、彼のパスの他の点。
最初のマルチソース点間floyed決定された距離と、その後、格納されたデータ構造を有する様々な点を列挙する、最終的なソート出力OK:アイデア。特別な場合:ビットは、その他の点に接続されていない場合、出力「互いに素」であればTOT = 0の列挙中など、P遭遇した場合に[I] [J] = P [j]は[I] = INFは、+ 1に、TOTの== N場合 - 1、その説明に加えて、意味がありません、と彼が接続されています。水の問題。。
ACコード:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e2 + 5;
const int INF = 1e8;
struct node
{
int id, sum, ans; //id表示序号, sum 表示 到其他源点的和, ans表示到其他源点的最小值
bool operator < (const node &oth) const
{
return sum < oth.sum;
}
}e[maxn];
int p[maxn][maxn], n;
void init() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) p[i][j] = 0;
else p[i][j] = INF;
}
}
memset(e, 0, sizeof(e));
}
int main()
{
while (cin >> n && n) {
init();
for (int i = 1; i <= n; i++) {
int num;
cin >> num;
for (int j = 0; j < num; j++) {
int vi, wi;
cin >> vi >> wi;
p[i][vi] = min (p[i][vi], wi);
}
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
p[i][j] = min (p[i][j], p[i][k] + p[k][j]);
}
}
for (int i = 1; i <= n; i++) {
int tot = 0;
e[i].ans = -INF;
e[i].id = i;
for (int j = 1; j <= n; j++) {
if (i == j) continue;
if (p[i][j] == INF && p[j][i] == INF) tot++;
else e[i].sum += p[i][j], e[i].ans = max (e[i].ans, p[i][j]);
}
if (tot == n - 1) {cout << "disjoint" << endl; return 0;}
}
sort (e + 1, e + n + 1);
cout << e[1].id << " " << e[1].ans << endl;
}
return 0;
}