程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Codeforces 238E. Meeting Her 圖論+記憶化搜索

Codeforces 238E. Meeting Her 圖論+記憶化搜索

編輯:關於C++

 

大意:

有一個 n 個結點的有向圖,邊權均為 1。Urapl 想從 a 出發去 b。有 p 個公交車公司。在每
一秒的開始,第 i 個公司的公交車隨機選擇一條從 s i 到 t i 的最短路徑然後走這條路徑。如果
一個公交車經過 Urpal 所在的交叉點,則 Urpal 可以上這輛公交車,他可以在中途任意一個結
點下車。
在任何時刻 Urpal 只知道他自己的位置和約會地點。當他上了公交車時他只知道這輛公交
車屬於第幾個公司。當然 Urpal 知道城市地圖和每個公司的 (s i , t i )。
求最壞情況下他需要乘坐公交車的次數。

 

解法:

先求出每輛公交車必須經過的點,再對必須經過的點搜索,算出每個點到目的地最壞情況下還要轉幾次車

 

E. Meeting Her time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output

Urpal lives in a big city. He has planned to meet his lover tonight.

The city has n junctions numbered from 1 to n. The junctions are connected by m directed streets, all the roads have equal length. Urpal lives in junction a and the date is planned in a restaurant in junction b. He wants to use public transportation to get to junction b. There arek bus transportation companies. At the beginning of every second, a bus from the i-th company chooses a random shortest path between junction si and junction ti and passes through it. There might be no path from si to ti. In that case no bus will leave from si to ti. If a bus passes through a junction where Urpal stands, he can get on the bus. He can also get off the bus at any junction along the path.

Now Urpal wants to know if it's possible to go to the date using public transportation in a finite amount of time (the time of travel is the sum of length of the traveled roads) and what is the minimum number of buses he should take in the worst case.

At any moment Urpal knows only his own position and the place where the date will be. When he gets on the bus he knows only the index of the company of this bus. Of course Urpal knows the city map and the the pairs (si, ti) for each company.

Note that Urpal doesn't know buses velocity.

Input

The first line of the input contains four integers n, m, a, b (2 ≤ n ≤ 100; 0 ≤ m ≤ n·(n - 1); 1 ≤ a, b ≤ n; a ≠ b).

The next m lines contain two integers each ui and vi (1 ≤ ui, vi ≤ n; ui ≠ vi) describing a directed road from junction ui to junction vi. All roads in the input will be distinct.

The next line contains an integer k (0 ≤ k ≤ 100). There will be k lines after this, each containing two integers si and ti(1 ≤ si, ti ≤ n; si ≠ ti) saying there is a bus route starting at si and ending at ti. Please note that there might be no path from si to ti, this case is described in the problem statement.

Output

In the only line of output print the minimum number of buses Urpal should get on on his way in the worst case. If it's not possible to reach the destination in the worst case print -1.

Sample test(s) input
7 8 1 7
1 2
1 3
2 4
3 4
4 6
4 5
6 7
5 7
3
2 7
1 4
5 7
output
2
input
4 4 1 2
1 2
1 3
2 4
3 4
1
1 4
output
-1

 

 

 

/* ***********************************************
Author        :CKboss
Created Time  :2015年07月05日 星期日 22時53分11秒
File Name     :CF238E_2.cpp
************************************************ */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include

using namespace std;

const int maxn=110;
const int INF=0x3f3f3f3f;

int n,m,a,b,t;
int from[maxn],to[maxn];
int dist[maxn][maxn];
int incur[maxn][maxn];

bool vis[maxn];
int g[maxn],f[maxn];

int dfs(int cur,int aim)
{
	if(cur==aim) return f[cur];
	if(vis[cur]==true) return g[cur];

	vis[cur]=true; g[cur]=0;
	for(int i=1;i<=n;i++)
	{
		if(dist[cur][i]+dist[i][aim]==dist[cur][aim]
				&&dist[cur][aim]==dist[i][aim]+1)
			g[cur]=max(g[cur],dfs(i,aim));
	}

	return g[cur]=min(g[cur],f[cur]);
}

int main()
{
	//freopen(in.txt,r,stdin);
	//freopen(out.txt,w,stdout);

	scanf(%d%d%d%d,&n,&m,&a,&b);

	memset(dist,63,sizeof(dist));
	for(int i=1;i<=n;i++) dist[i][i]=0;

	for(int i=0,u,v;i=INF) ans=-1;
	printf(%d
,ans);


    return 0;
}

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved