ZOJ-3318
2015-04-14 12:13
295 查看
Strange CountryTime Limit: 1 Second Memory Limit: 32768 KB
There are n cities in the dream country. Let's use integers from 1 to n to denote the cities. There are some roads between cities. To some strange, all the roads are bidirectional and the roads change from time to time. You have m maps of the country of different time. You are going to the dream country soon and you want to start your journey at city s and finish it at city t. Though you cannot predict the condition when you get there, you think it is useful to study the maps carefully. After studying the maps, you find that all the roads in all maps have the same length and there is an s-t path in each map. You want to choose an s-t path in each map and the paths are relatively short. Further more you don't want too many changes in the paths.
Formally suppose you have chosen an s-t path in each map, namely P1, P2,...Pm. Let's define a path's length to be simply the number of edges in it and use LEN to denote the total length of all the paths. Let's define a function as follow: CHANGE(P1, P2,...Pm) is the number of indices i (0 < i < m) for which Pi != Pi+1. Let's define the cost function as follow: COST(P1, P2,...Pm) = LEN + CHANGE(P1, P2,...Pm). You are supposed to find the minimum cost.
Input
There are multiple test cases. The first line of input is an integer T (0 < T < 205) indicating the number of test cases. Then T test cases follow. The first line of each test case is 4 integers n, m, s, t (1 < n, m <= 30, 0 < s, t <= n, s != t). Then there are m map descriptions. The first line of each map description is an integer R, the number of roads in the map (0 < R <= n * (n - 1) / 2). Each of the next R lines contains two integers a, b, the two cities that road connects( 0 < a, b <= n, a != b). You can assume that for each test case there is an s-t path in each map.
Output
For each test case, output in a line the minimum cost defined above.
Sample Input
Sample Output
Hint
Test case 1: three paths are 2-1-3, 2-3, 2-3.
Test case 2: both paths are 1-2-3-4.
Author: CAO, Peng
Source: The 10th Zhejiang University Programming Contest
Submit
Status
There are n cities in the dream country. Let's use integers from 1 to n to denote the cities. There are some roads between cities. To some strange, all the roads are bidirectional and the roads change from time to time. You have m maps of the country of different time. You are going to the dream country soon and you want to start your journey at city s and finish it at city t. Though you cannot predict the condition when you get there, you think it is useful to study the maps carefully. After studying the maps, you find that all the roads in all maps have the same length and there is an s-t path in each map. You want to choose an s-t path in each map and the paths are relatively short. Further more you don't want too many changes in the paths.
Formally suppose you have chosen an s-t path in each map, namely P1, P2,...Pm. Let's define a path's length to be simply the number of edges in it and use LEN to denote the total length of all the paths. Let's define a function as follow: CHANGE(P1, P2,...Pm) is the number of indices i (0 < i < m) for which Pi != Pi+1. Let's define the cost function as follow: COST(P1, P2,...Pm) = LEN + CHANGE(P1, P2,...Pm). You are supposed to find the minimum cost.
Input
There are multiple test cases. The first line of input is an integer T (0 < T < 205) indicating the number of test cases. Then T test cases follow. The first line of each test case is 4 integers n, m, s, t (1 < n, m <= 30, 0 < s, t <= n, s != t). Then there are m map descriptions. The first line of each map description is an integer R, the number of roads in the map (0 < R <= n * (n - 1) / 2). Each of the next R lines contains two integers a, b, the two cities that road connects( 0 < a, b <= n, a != b). You can assume that for each test case there is an s-t path in each map.
Output
For each test case, output in a line the minimum cost defined above.
Sample Input
2 3 3 2 3 2 1 2 3 1 3 1 2 2 3 3 2 2 2 1 2 3 4 2 1 4 3 1 2 2 3 3 4 3 1 2 2 3 3 4
Sample Output
5 6
Hint
Test case 1: three paths are 2-1-3, 2-3, 2-3.
Test case 2: both paths are 1-2-3-4.
Author: CAO, Peng
Source: The 10th Zhejiang University Programming Contest
Submit
Status
#include <iostream> #include <stdio.h> #include<cmath> #include<algorithm> #include<string.h> #include<queue> #include<set> #define maxn 40 using namespace std; int dist[maxn]; int mark[maxn][maxn]; int Edge[maxn][maxn]; int mmap[maxn][maxn][maxn]; int dp[maxn]; int n,m,s,t,flag; int bfs() { memset(dist,0x3f,sizeof(dist)); flag = dist[0]; dist[s] = 0; queue<int>que; while(!que.empty()) que.pop(); que.push(s); while(!que.empty()) { int tmp = que.front(); que.pop(); for(int i=1;i<=n;i++) { if(Edge[tmp][i] == 1 && dist[i] > dist[tmp] + 1) { dist[i] = dist[tmp] + 1; que.push(i); } } } return dist[t]; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int T; scanf("%d",&T); while(T--) { scanf("%d %d %d %d",&n,&m,&s,&t); int R,u,v; memset(mmap,0,sizeof(mmap)); memset(mark,0,sizeof(mark)); memset(dp,0,sizeof(dp)); for(int i=0; i<m; i++) { scanf("%d",&R); for(int j=0; j<R; j++) { scanf("%d %d",&u,&v); mmap[i][u][v] = 1; mmap[i][v][u] = 1; } } for(int i=0; i<m; i++) { memset(Edge,1,sizeof(Edge)); for(int j=i; j<m; j++) { for(int k=1; k<=n; k++) { for(int t= 1; t <=n; t++) { Edge[k][t] = Edge[k][t] & mmap[j][k][t]; } } mark[i][j] = bfs(); } } dp[0] = mark[0][0]; for(int i=1;i<=m;i++) { if(mark[0][i] != flag) dp[i] = mark[0][i] *(i+1); else dp[i] = flag; for(int j=0;j<i;j++) { if(mark[j+1][i] != flag) dp[i] = min(dp[i] ,dp[j] + mark[j+1][i]*(i-j) + 1); } } printf("%d\n",dp[m-1]); } return 0; }
相关文章推荐
- [ZOJ 3318] Strange Country [搜索]
- ZOJ 1068 摩斯密码
- ZOJ 3300 Mahjong(DFS)
- zoj 1750 Idiomatic Phrases Game (dijkstra)
- dp递推 zoj 3747 Attack on Titans
- ZOJ 1241 求直角三角形第三边
- ZOJ 1505 Solitaire(双向广搜)
- [ZOJ 3047] Connect Four [模拟+博弈]
- ZOJ 1078 题目大意是 :判断 一些数在从二到十六的进制是否是回文数
- ZOJ 1414
- zoj1586 QS Network ——最小生成树入门题_Prim算法
- zoj 1010
- ZOJ 1586
- ZOJ 1889 n的倍数使11111…位数最少
- zoj 3180 Number Game
- ZOJ 3794 最短路
- ZOJ1003-Crashing Balloon
- ZOJ 2351
- ZOJ Problem Set - 1442 Dinner Is Ready
- ZOJ-3721