题目1495:关键点
来源:互联网 发布:淘宝实时交易量 编辑:程序博客网 时间:2024/06/11 16:57
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h> #define NSIZE 10010#define MSIZE 100010 typedef struct node { int link ; int next ;} node ; node data[2*MSIZE] ;int datap ; int links[NSIZE] ; int dis_s[NSIZE] , dis_t[NSIZE] ;int q[NSIZE] , visit[NSIZE] ; int n , m , s , t ; inline int get_new(){ return datap ++ ;} int add_edge( int a , int b ){ int new_id = get_new() ; data[new_id].link = b ; data[new_id].next = links[a] ; links[a] = new_id ; return 0 ;} int extend_normal( int start , int dis[] ){ for ( int i = 1 ; i <= n ; i ++ ) { dis[i] = -1 ; } dis[start] = 0 ; int head = 0 ; int tail = 1 ; q[head] = start ; memset( visit , 0 , sizeof(visit) ) ; visit[start] = 1 ; while ( tail > head ) { int cur_node = q[head] ; int next = links[cur_node] ; while ( next != -1 ) { int next_node = data[next].link ; if ( !visit[next_node] ) { q[tail] = next_node ; dis[next_node] = dis[cur_node]+1 ; visit[next_node] = 1 ; tail ++ ; } next = data[next].next ; } head ++ ; }} int proc_one(){ if ( scanf( "%d%d%d%d" , &n , &m , &s , &t ) == EOF ) { return 0 ; } for ( int i = 1 ; i <= n ; i ++ ) { links[i] = -1 ; } datap = 0 ; for ( int i = 0 ; i < m ; i ++ ) { int a , b ; scanf( "%d%d" , &a , &b ) ; add_edge( a , b ) ; add_edge( b , a ) ; } extend_normal( s , dis_s ) ; extend_normal( t , dis_t ) ; int min_dis = dis_s[t] ; // should be equal to dis_t[s] if ( min_dis == -1 ) { printf( "0\n" ) ; return 1 ; } // do final extend int head = 0 ; int tail = 1 ; q[head] = s ; int disl = 0 ; int disr = min_dis ; memset( visit , 0 , sizeof(visit) ) ; visit[s] = 1 ; int ans = 0 ; while ( 1 ) { int ori_tail = tail ; for ( int i = head ; i < ori_tail ; i ++ ) { int cur_node = q[i] ; int next = links[cur_node] ; while ( next != -1 ) { int next_node = data[next].link ; if ( visit[next_node] ) { next = data[next].next ; continue ; } if ( dis_s[next_node] != disl + 1 || dis_t[next_node] != disr - 1 ) { next = data[next].next ; continue ; } q[tail] = next_node ; visit[next_node] = 1 ; tail ++ ; next = data[next].next ; } } if ( visit[t] ) { break ; } head = ori_tail ; if ( tail - head == 1 ) { ans ++ ; } disl ++ ; disr -- ; } printf( "%d\n" , ans ) ; return 1 ;} int main(){ while ( proc_one() ) { ; } return 0 ;}/************************************************************** Problem: 1495 User: cust123 Language: C++ Result: Accepted Time:190 ms Memory:2780 kb****************************************************************/
0 0
- 题目1495:关键点
- 关键点
- 面试关键题目整理
- Hibernate关键点整理
- 关键点记要
- Win32 关键点总结
- Hibernate的关键点
- Java学习关键点
- 寻找关键点
- rtp协议关键点
- 分布式文件系统关键点
- Win32 关键点总结
- Win32 关键点总结
- App审核关键点
- Win32 关键点总结
- WPF - 几个关键点
- snprintf关键注意点
- 计算机网络关键点
- 4月28日,URLReader,每日20行。
- 简单工厂模式
- vim 编辑器常用命令总结
- 模拟实现list(iterator)
- 网页切图div+css命名
- 题目1495:关键点
- 4月28日
- 题目1496:数列区间
- 在linux(ubuntu 14.04LTS)下安装matlab 2012a 32bit
- hdu 3416 Marriage Match IV 【图论-网络流-最短路+最大流(spfa + Dinic)】
- 关于unity CharcterController的碰撞检测
- 学习链接
- cmake _GLIBCXX_USE_CXX11_ABI undefined reference std::__cxx11::basic_string
- CPU卡程序设计实例(十三)终端向ESAM发送数据