# 題目: UVa 12442 - Forwarding Emails

# 題目說明

一個小鎮裡面,每一個人都會寄信給另外一個人
求第一封信寄給誰能讓最多人看到


INPUT:
第一行有一個整數 T ,代表有 T 筆測資
每筆測資第一行有一個整數 N ,代表人數
接下來有 N 行,每行有兩個整數 uv ,代表 u 寄信給 v


OUTPUT:
輸出第一封信寄給誰能讓最多人看到
(如果數量一樣則取編號小的)

# 解題方法

dfs ,儲存寄信數量及第一個人的編號
接著判斷是否為最大數量

# 參考程式碼

#include <iostream>
#include <vector>
using namespace std;
vector<int> sent;
vector<bool> check, sum;
int times;
void dfs(int num)
{
	++times;
	sum[num] = check[num] = true;
	if (!check[sent[num]]) dfs(sent[num]);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int T, N;
	cin >> T;
	for (int i = 1; i <= T; ++i) {
		cin >> N;
		sent.assign(N + 1, -1);
		sum.assign(N + 1, false);
		for (int j = 0, a, b; j < N; ++j) cin >> a >> b, sent[a] = b;
		
		int ftimes = 1;
		int fnum = sent[0];
		for (int j = 1; j <= N; ++j)
			if (!sum[j]) {
				check.assign(N + 1, false);
				check[j] = true;
				times = 1;
				dfs(sent[j]);
				if (times > ftimes || (times == ftimes && j < fnum))
					fnum = j, ftimes = times;
			}
		cout << "Case " << i << ": " << fnum << "\n";
	}
	return 0;
}

# 參考資料

https://www.larrysprognotes.com/UVa%20-%2012442/