24h購物| | PChome| 登入
2013-07-31 20:45:27| 人氣3,168| 回應0 | 上一篇 | 下一篇

[UVA] 1148 - The mysterious X network

推薦 0 收藏 0 轉貼0 訂閱站台

One of the reasons for which École polytechnique (nicknamed ``X" for reasons to be explained during the debriefing talk) is so deeply rooted in French society is its famous network of camarades - former students of the same school. When one camarade wants something (money, job, etc.), he can ask this network for help and support. In practice, this means that when he/she wants to reach some other camarade, not always of the same year, then surely he can find intermediate camarades to get to her/him. Note that the ``camarade" relationship is symmetric. Due to the magic of the X network, there is always a means to reach anybody.

The program you have to write is supposed to help to minimize the number of these intermediate camarades.

Input 

The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and there is also a blank line between two consecutive inputs.


The huge file of all living camarades is simplified so as to obey the following format. The first line in the file is the number of camarades, say N , an integer 1$ le$N$ le$105 . Camarades are labeled from 0 to N - 1 . Follow N lines. Each line starts with the camarade label c , followed by the number of other camarades he/she knows, say nc , followed by the labels of those nc camarades. All these integers are separated by a single blank. It is assumed that nc is always less than 100. The last line in the file is the label of the camarade seeking help (say c1 ) followed by the label of the camarade he wants help from, say c2 ( c2 $ neq$ c1 ).

Output 

For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.


Your program should output three integers separated by a blank: c1 , c2 and the minimal number of intermediate camarades to reach c2 .

Sample Input 

1

4
0 3 1 2 3
1 1 0
2 2 0 3
3 2 0 2
1 2

Sample Output 

1 2 1



題目描述:

想要尋求某人的幫助,最少要轉接幾個人的手。
題目解法:

事實上只是單純地找到最短路。權重都是 1,直接 BFS。

#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
vector<int> g[100005];
inline int ReadInt(int *x) {
static char c, neg;
while((c = getchar()) < '-') {if(c == EOF) return EOF;}
neg = (c == '-') ? -1 : 1;
*x = (neg == 1) ? c-'0' : 0;
while((c = getchar()) >= '0')
*x = (*x << 3) + (*x << 1) + c-'0';
*x *= neg;
return 1;
}
int main() {
int testcase;
int n, m, x, y;
int i, j, k, st, ed;
scanf("%d", &testcase);
while(testcase--) {
scanf("%d", &n);
for(i = 0; i < n; i++)
g[i].clear();
for(i = 0; i < n; i++) {
//scanf("%d %d", &x, &m);
ReadInt(&x);
ReadInt(&m);
while(m--) {
//scanf("%d", &y);
ReadInt(&y);
g[x].push_back(y);
}
}
scanf("%d %d", &st, &ed);
queue<int> Q;
int dist[100005] = {};
Q.push(st);
dist[st] = 1;
while(!Q.empty()) {
x = Q.front(), Q.pop();
for(i = 0; i < g[x].size(); i++) {
if(dist[g[x][i]] == 0) {
dist[g[x][i]] = dist[x]+1;
Q.push(g[x][i]);
}
}
if(dist[ed]) break;
}
printf("%d %d %d\n", st, ed, dist[ed]-2);
if(testcase)
puts("");
}
return 0;
}
 

台長: Morris
人氣(3,168) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 教育學習(進修、留學、學術研究、教育概況) | 個人分類: UVA |
此分類下一篇:[UVA] 10610 - Gopher and Hawks
此分類上一篇:[UVA] 388 - Galactic Import

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文