UVa10681 - Teobaldo's Trip(矩阵乘法、包传递)

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();
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值