Problem A - Teobaldo's Trip
Time Limit: 1 second
Memory Limit: 1 Mb
Teobaldo works for the Brazilian government. In his job, he travels a lot. When Teolbaldo travels from a city S to a city E he can spend up to D days in the trip.
As Teobaldo doesn't like to work, he always spend the maximum number of days in his trips. In each day of his trip, Teobaldo sleeps in a different city from the previous day, because he thinks it is boring to stay in the same city two consecutive days.
In this problem, you should help Teobaldo to schedule his trips.
Input
The input file contains several input sets. The description of each set is given below:
Each set starts with two integers C (0 < C ≤ 100), the number of cities, and L (0 ≤ L ≤ 500), the number of links between the cities. Follow Llines, where each line has two numbers: A and B (1 ≤ A,B ≤ C), meaning there is a link between these two cities. You can assume that A and B are different numbers. After the L lines, there are three integers: S,E and D. Where S is the city where the trip must start, E is the city where the trip must end, and D (0 ≤ D ≤ 200) is the maximum number of days for Teobaldo to go from S to E.
Input is terminated by a set where C=L=0. This set should not be processed. There is a blank line beteween two input sets.
Output
For each input set produce one line of output, indicating if Teobaldo can travel how he wishes. See the examples below for the exact input/output format.
Sample Input
3 2 1 2 2 3 3 1 2 3 2 1 2 1 3 1 3 2 0 0
Sample Output
Yes, Teobaldo can travel. No, Teobaldo can not travel.
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.io.StreamTokenizer;
public class Main {
public static final boolean DEBUG = false;
public static final int N = 110;
public BufferedReader cin;
public PrintWriter cout;
public StreamTokenizer tokenizer;
public int c, l;
public int[][] f;
public int s, e, d;
public void init() {
try {
if (DEBUG) {
cin = new BufferedReader(new InputStreamReader(
new FileInputStream("e:\\uva_in.txt")));
} else {
cin = new BufferedReader(new InputStreamReader(System.in));
}
tokenizer = new StreamTokenizer(cin);
cout = new PrintWriter(new OutputStreamWriter(System.out));
} catch (Exception e) {
e.printStackTrace();
}
}
public String next()
{
try {
tokenizer.nextToken();
if (tokenizer.ttype == StreamTokenizer.TT_EOF) return null;
else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) { return
String.valueOf((int)tokenizer.nval); }
else return tokenizer.sval;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public boolean input()
{
c = Integer.parseInt(next());
l = Integer.parseInt(next());
if (c == 0 && l == 0) return false;
f = new int[c][c];
for (int i = 0; i < l; i++) {
int a, b;
a = Integer.parseInt(next());
b = Integer.parseInt(next());
a--; b--;
f[a][b] = f[b][a] = 1;
}
s = Integer.parseInt(next());
e = Integer.parseInt(next());
d = Integer.parseInt(next());
s--; e--;
return true;
}
public int[][] matrixMul(int[][] a, int [][] b)
{
int n = a.length;
int[][] ans = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int sum = 0;
for (int k = 0; k < n; k++) {
sum |= a[i][k] & b[k][j];
}
ans[i][j] = sum;
}
}
return ans;
}
public int[][] matrixExp(int[][] a, int b)
{
int n = a.length;
int[][] product = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) product[i][j] = 1;
else product[i][j] = 0;
}
}
while (b > 0) {
if ((b & 1) != 0) {
product = matrixMul(product, a);
}
a = matrixMul(a, a);
b >>= 1;
}
return product;
}
public void solve()
{
int n = f.length;
int[][] ans = new int[n][n];
ans = matrixExp(f, d);
if (ans[s][e] != 0) {
cout.println("Yes, Teobaldo can travel.");
} else {
cout.println("No, Teobaldo can not travel.");
}
cout.flush();
}
public static void main(String[] args)
{
Main solver = new Main();
solver.init();
while (solver.input()) {
solver.solve();
}
}
}