HDU 4014 Jimmy’s travel plan(图计数)
Jimmy’s travel plan
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)
Total Submission(s): 341 Accepted Submission(s): 58
lives in a huge kingdom which contains lots of beautiful cities. He
also loves traveling very much, and even would like to visit each city
in the country. Jaddy, his secretary, is now helping him to plan the
routes, however, Jaddy suddenly find that is quite a tough task because
it is possible for Jimmy to ask route’s information toward any city.
What was worth? Jaddy has to response for queries about the distance
information nearly between any pair of cities due to the undeterminable
starting city which Jimmy is living in when he raises a query. Because
of the large scale of the whole country, Jaddy feel hopeless to archive
such an impossible job, however, in order to gratify his manager, Jaddy
is now looking forward to your assistance.
There might be good news
about Jaddy’s work: since Jimmy is very lazy and would not like to
travel to a destination whose distance between the original city is
larger than TWO. That means only one intermediate city among the route
is acceptable (Apparently, all the connecting paths between any two
cities, if exists, have the same length as ONE). But don’t be fooled:
Jimmy also needs to know that how many alternative different routes are
available so that he can have more options. In particular two routes
were named as different if and only if there is at least one path in the
two routes is distinguishable, moreover, if more than one paths exist
between a particular pair of cities, they are considered as distinct.
has multiple test cases. The first line of the input has a single
integer T indication the number of test cases, then each test case
following. For each test case, the first line contains two integers N
and M indication the number of cities and paths in the country. Then M
lines are following, each line contains a pair of integers A and B,
separated by space, denoting an undirected path between city A and city
B, all the cities are numbered from 1 to N. Then a new line contains a
single integer Q, which means there are Q queries following. Each query
contains a couple of integers A and B which means querying the distance
and number of shortest routes between city A and B, each query occupy a
single line separately.
All the test cases are separated by a single blank line.
You can assume that N, Q <= 100000, M <= 200000.
each test case, firstly output a single line contains the case number,
then Q lines for the response to queries with the same order in the
input. For each query, if there exists at least one routes with length
no longer than TWO, then output two integer separated by a single space,
the former is the distance (shortest) of routes and the later means how
many different shortest routes Jimmy can choose; otherwise, output a
single line contains “The pair of cities are not connected or too far
away.” (quotes for clarifying). See the sample data carefully for
further details.
#include<bits/stdc++.h>
using namespace std ;
const int N = ;
const int M = ;
const long long K = ;
int n , m ;
struct node {
int u , v ;
long long cnt ;
bool operator < ( const node &a ) const {
if( u != a.u ) return u < a.u ;
else return v < a.v ;
}
} e[M] ;
int tot ;
int in[N] ;
const int HASH = ;
struct HASHMAP {
long long key[N] , f[N] ;
int head[HASH] , next[N] , size ;
void init() {
memset( head , - , sizeof head ) ;
size = ;
}
void insert( int u , int v , long long ans ) {
long long KEY = K * u + v ;
int c = KEY % HASH ;
f[size] = ans ;
key[size] = KEY ;
next[size] = head[c] ;
head[c] = size++;
}
long long find( int u , int v ) {
long long KEY = K * u + v ;
int c = KEY % HASH ;
for( int i = head[c] ; ~i ; i = next[i] ) {
if( key[i] == KEY ) return f[i] ;
}
return - ;
}
} mp ; long long find( int u , int v ) {
int l = , r = m - ;
// cout << "l :" << l << " r : " << r << endl ;
if( l > r ) return - ;
if( u > e[r].u || ( u == e[r].u && v > e[r].v ) ) return - ;
if( v < e[l].v || ( v == e[l].v && u < e[l].u ) ) return - ;
while( l <= r ) {
int mid = (l+r)>>;
if( u < e[mid].u ) {
r = mid - ;
}
else if( u == e[mid].u ) {
if( v < e[mid].v ) r = mid - ;
else if( v > e[mid].v ) l = mid + ;
else return e[mid].cnt ;
}
else {
l = mid + ;
}
}
return - ;
}
vector< pair<int,long long> >g[N]; void Work() {
mp.init();
int q ; cin >> q ;
while( q-- ) {
int u , v ; cin >> u >> v ;
u-- , v-- ;
if( u > v ) swap( u , v ) ;
else if( u == v ) { cout << "0 1"<< endl ; continue ; }
long long ans = find( u , v ) ;
if( ans != - ) {
cout << "1 " << ans << endl ;
} else {
ans = mp.find( u , v ) ;
if( ans == - ) {
ans = ;
if( in[u] > in[v] ) swap( u , v ) ;
for( int i = ; i < g[u].size() ; ++i ) {
int mid = g[u][i].first ;
long long cnt1 = g[u][i].second , cnt2 = find( min(mid,v) , max(mid,v) );
if( cnt2 != - ) ans += cnt1 * cnt2 ;
}
if( u > v ) swap( u , v ) ;
mp.insert( u , v , ans ) ;
}
if( ans ) cout << "2 " << ans << endl ;
else cout << "The pair of cities are not connected or too far away." << endl ;
}
}
} void Gao() {
memset( in , , sizeof in );
for( int i = ; i < n ; ++i ) g[i].clear();
cin >> n >> m ;
if( !m ) return ;
for( int i = ; i < m ; ++i ) {
int x , y ; cin >> x >> y ;
x-- , y-- ;
if( x > y ) swap( x , y ) ;
e[i].u = x , e[i].v = y , e[i].cnt = ;
in[x]++ , in[y]++ ;
}
sort( e , e + m ) ;
tot = ;
for( int i = ; i < m ; ++i ) {
if( e[tot-].u == e[i].u && e[tot-].v == e[i].v ) {
e[tot-].cnt++ ;
} else {
e[tot++] = e[i] ;
}
}
m = tot ;
for( int i = ; i < m ; ++i ) {
g[e[i].u].push_back( make_pair( e[i].v,e[i].cnt) ) ;
g[e[i].v].push_back( make_pair( e[i].u,e[i].cnt) ) ;
}
} int Run() {
int _ , cas = ; cin >> _ ;
while( _-- ) {
cout << "Case #" << cas++ << ":" << endl ;
Gao(); Work();
}
return ;
}
int main() {
ios::sync_with_stdio();
return Run();
}
HDU 4014 Jimmy’s travel plan(图计数)的更多相关文章
- hdu 4885 TIANKENG’s travel(bfs)
题目链接:hdu 4885 TIANKENG's travel 题目大意:给定N,L,表示有N个加油站,每次加满油能够移动距离L,必须走直线,可是能够为斜线.然后给出sx,sy,ex,ey,以及N个加 ...
- PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS
PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...
- PAT1030 Travel Plan (30)---DFS
(一)题意 题目链接:https://www.patest.cn/contests/pat-a-practise/1030 1030. Travel Plan (30) A traveler's ma ...
- 有标号的DAG图计数1~4
前言 我什么都不会,菜的被关了起来. 有标号的DAG图I Solution 考虑递推,设\(f_i\)表示i个点的答案,显然这个东西是可以组合数+容斥递推? 设\(f_i\)表示i个点的答案,我们考虑 ...
- PAT 1030 Travel Plan[图论][难]
1030 Travel Plan (30)(30 分) A traveler's map gives the distances between cities along the highways, ...
- 1030 Travel Plan (30 分)
1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, toge ...
- [图算法] 1030. Travel Plan (30)
1030. Travel Plan (30) A traveler's map gives the distances between cities along the highways, toget ...
- PAT_A1030#Travel Plan
Source: PAT A1030 Travel Plan (30 分) Description: A traveler's map gives the distances between citie ...
- PAT 甲级 1030 Travel Plan (30 分)(dijstra,较简单,但要注意是从0到n-1)
1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, to ...
随机推荐
- 消息中间件之 RabbitMQ
文章内容来源 https://www.cnblogs.com/jun-ma/p/4840869.html 延伸阅读文章 https://blog.csdn.net/growing_duck/artic ...
- GDOI2016总结
前言 第一次GDOI,收获了很多. 这几天下来的生活有趣而精彩,尽管我没有高级的腐败工具,但是还是通过偷抢拐骗各种方法满足了腐败的欲望了. BUT,参加GDOI可不是为了玩耍,而是去提升自己的实力,磨 ...
- linux运维、架构之路-KVM虚拟化技术
一.云计算概述 云计算:是一种资源使用和交付模式 虚拟化:一种具体的技术,用来将物理机虚拟成为多个相互独立的虚拟机.云计算不等于虚拟化,云计算是使用了虚拟化的技术做支撑 二.KVM配置使用 1.系统环 ...
- Spring boot @Transactional
1.注解@Transactional 2.异常回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); @Ov ...
- mysql WHERE语句 语法
mysql WHERE语句 语法 作用:如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句.珠海大理石平尺 语法:SELECT 列名称 FROM 表名称 WHERE 列 运算 ...
- sh_02_第2个Python程序
sh_02_第2个Python程序 print("hello")
- 如何快速优雅的解决:ORA-02290: 违反检查约束条件 异常问题
在向oracle保存数据时,控制台报错如下: 很明显是保存时,该表的设计不允许某个字段非空导致的,但由于该表的数量较多,采用断点的方式有太过麻烦, 这里笔者采用 oracle 的客户端连接工具orac ...
- centos 6.9 mysql 安装配置
1.全新系统,安装mysql yum -y install mysql mysql-server mysql-devel 2.启动mysql service mysqld start 3.修改密码 登 ...
- page size
https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_page_size https://dev.mysql.com/doc/refma ...
- IDE(Pycharm&&IDEA)配置文件模版
Pycharm ====> 修改Python Script : 修改位置:Edito >> File and CodeTemplates >> Python Script ...