传送门:【HDU】1535 Invitation Cards

题目分析:题目真难读。。。。。。其实题目的意思就是让求从编号为1的点到其他所有点的最短路距离之和加上其他所有点到编号为1的点的最短路距离之和。只要在原图以及反向图分别跑一次最短路就好了。。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;#define REP( i , a , b ) for ( int i = ( a ) ; i < ( b ) ; ++ i )
#define FOR( i , a , b ) for ( int i = ( a ) ; i <= ( b ) ; ++ i )
#define REV( i , a , b ) for ( int i = ( a ) ; i >= ( b ) ; -- i )
#define travel( e , H , u ) for ( Edge* e = H[u] ; e ; e = e -> next )
#define CLR( a , x ) memset ( a , x , sizeof a )const int MAXN = 1000005 ;
const int MAXH = 2000005 ;
const int MAXE = 2000005 ;
const int INF = 0x3f3f3f3f ;struct Edge {int v , c ;Edge* next ;
} ;struct Heap {int v , idx ;Heap () {}Heap ( int v , int idx ) : v ( v ) , idx ( idx ) {}bool operator < ( const Heap& a ) const {return v < a.v ;}
} ;struct priority_queue {Heap heap[MAXH] ;int point ;priority_queue () : point ( 1 ) {}void clear () {point = 1 ;}bool empty () {return point == 1 ;}void maintain ( int o ) {int x = o ;while ( o > 1 && heap[o] < heap[o >> 1] ) {swap ( heap[o] , heap[o >> 1] ) ;o >>= 1 ;}o = x ;int p = o , l = o << 1 , r = o << 1 | 1 ;while ( o < point ) {if ( l < point && heap[l] < heap[p] ) p = l ;if ( r < point && heap[r] < heap[p] ) p = r ;if ( p == o ) break ;swap ( heap[o] , heap[p] ) ;o = p , l = o << 1 , r = o << 1 | 1 ;}}void push ( int v , int idx ) {heap[point] = Heap ( v , idx ) ;maintain ( point ++ ) ;}void pop () {heap[1] = heap[-- point] ;maintain ( 1 ) ;}int front () {return heap[1].idx ;}Heap top () {return heap[1] ;}
} ;struct Shortest_Path_Algorithm {priority_queue q ;Edge E[MAXE] , *H[MAXN] , *cur ;Edge rE[MAXE] , *rH[MAXN] , *rcur ;int d[MAXN] ;bool vis[MAXN] ;int Q[MAXN] , head , tail ;void init () {cur = E ;rcur = rE ;CLR ( H , 0 ) ;CLR ( rH , 0 ) ;}void addedge ( int u , int v , int c ) {cur -> v = v ;cur -> c = c ;cur -> next = H[u] ;H[u] = cur ++ ;rcur -> v = u ;rcur -> c = c ;rcur -> next = rH[v] ;rH[v] = rcur ++ ;}void dijkstra ( int s , Edge* H[] ) {q.clear () ;CLR ( d , INF ) ;CLR ( vis , 0 ) ;d[s] = 0 ;q.push ( d[s] , s ) ;while ( !q.empty () ) {int u = q.front () ;q.pop () ;if ( vis[u] ) continue ;vis[u] = 1 ;travel ( e , H , u ) {int v = e -> v , c = e -> c ;if ( d[v] > d[u] + c ) {d[v] = d[u] + c ;q.push ( d[v] , v ) ;}}}}void spfa ( int s , Edge* H[] ) {head = tail = 0 ;CLR ( d , INF ) ;CLR ( vis , 0 ) ;d[s] = 0 ;Q[tail ++] = s ;while ( head != tail ) {int u = Q[head ++] ;if ( head == MAXN ) head = 0 ;vis[u] = 0 ;travel ( e , H , u ) {int v = e -> v , c = e -> c ;if ( d[v] > d[u] + c ) {d[v] = d[u] + c ;if ( !vis[v] ) {vis[v] = 1 ;if ( d[v] < d[Q[head]] ) {if ( head == 0 ) head = MAXN ;Q[-- head] = v ;} else {Q[tail ++] = v ;if ( tail == MAXN ) tail = 0 ;}}}}}}} G ;int n , m ;void scanf ( int& x , char c = 0 ) {while ( ( c = getchar () ) < '0' || c > '9' ) ;x = c - '0' ;while ( ( c = getchar () ) >= '0' && c <= '9' ) x = x * 10 + c - '0' ;
}void solve () {int u , v , c ;int ans = 0 ;G.init () ;scanf ( n ) , scanf ( m ) ;while ( m -- ) {scanf ( u ) , scanf ( v ) , scanf ( c ) ;G.addedge ( u , v , c ) ;}G.dijkstra ( 1 , G.H ) ;FOR ( i , 1 , n ) ans += G.d[i] ;G.dijkstra ( 1 , G.rH ) ;FOR ( i , 1 , n ) ans += G.d[i] ;printf ( "%d\n" , ans ) ;
}int main () {int T ;scanf ( "%d" , &T ) ;while ( T -- ) solve () ;return 0 ;
}

【HDU】1535 Invitation Cards 最短路相关推荐

  1. hdu 1535 Invitation Cards

    点击打开链接hdu1535 思路:最短路+SPFA 分析: 1 题目要求的是总的最小的花费,意思就是要求每一个人的花费都最小. 2 由于每一个人都是从1出去,最后还是都要回到1的,那么求解的时候就要分 ...

  2. hdu1535 Invitation Cards 最短路

    有一张图,若干人要从不同的点到同一个中间点,再返回,求总费用最小 中间点到各个点最小费用是普通的最短路 各个点到中间点最小费用其实就是将所有路径反向建边之后中间点到各个点的最小费用,同样用最短路就可以 ...

  3. D - Silver Cow Party J - Invitation Cards 最短路

    http://poj.org/problem?id=3268 题目思路: 直接进行暴力,就是先求出举行party的地方到每一个地方的最短路,然后再求以每一个点为源点跑的最短路. 还有一种方法会快很多, ...

  4. Invitation Cards——正反最短路

    poj 1511: Invitation Cards 题意:点1到其他点的最短距离+其他点到点1的最短距离 的总和. 1.双向建图 正向建图是1到其他点的距离,反向建图则是其他点到1的距离. 2.数据 ...

  5. 【POJ - 1511】 Invitation Cards(Dijkstra + 反向建图 多源到单源最短路的处理)

    题干: In the age of television, not many people attend theater performances. Antique Comedians of Mali ...

  6. Invitation Cards POJ - 1511【最短路】

    Invitation Cards POJ - 1511 题目 思路:建两张图,一张正向一张反向,先在正向图里求一遍一号点到所有点的距离,再在反向图里求一遍,反向图里一号点到所有点的距离的意思是所有点到 ...

  7. Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))

    题目大意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费.有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到了晚上再返回点 ...

  8. Invitation Cards(建反图 + 跑两遍SPFA)

    题目如下: In the age of television, not many people attend theater performances. Antique Comedians of Ma ...

  9. POJ 1511:Invitation Cards

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 26994   Accepted: 895 ...

最新文章

  1. Pinia轻量级状态管理
  2. axure按钮切换颜色_如何用Axure画出Web产品的列表组件:基础画法
  3. Realm_King 之 .NET操作XML完整类
  4. Jquery tmpl模板中if条件有多个时的写法
  5. 微信小程序PHP文件建在哪里,微信小程序解析H5文件方法
  6. arm linux演艺(三)
  7. 紫光国微:目前业务以芯片设计为主 制造占比较低
  8. android 原生开发 3d地图 下载_arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)...
  9. 我用了20年ERP系统,但是用它做报表,我却后悔了
  10. centos 6.4 postfix mysql_CentOS 6.4下Postfix邮件服务安装和基本配置
  11. 天线工程手册_胆大心细 专业敬业——记FPSO改装MV30项目球形天线组装工程
  12. Html静态页面更新,解决浏览器缓存不更新问题
  13. 终于,连字节、腾讯都烧不起钱了
  14. Google搜索引擎的使用技巧
  15. Yandex-好用的以图搜图网站
  16. 输入汉语星期几输出英文c语言程序,C根据英文星期获取对应汉字或数字的星期函数(1)...
  17. python设置窗口位置_python中tkinter窗口位置
  18. 怎么获取网络舆情舆论数据的三大技术解决方法
  19. 监听器-Listener
  20. 产品宣传手册是如何制作的?

热门文章

  1. android 文件浏览器源码,android 文件管理器源码
  2. android文件管理器listview,浅析Android文件管理器(项目一)
  3. vector的骚操作
  4. javaScript中创建对象和Java创建对象的区别
  5. 关于原型法,以及敏捷的需求 2010-9-13
  6. 剪辑视频调整视频播放倍速,改变视频时长
  7. java生成6随机数字和字母_Java生成含字母和数字的6位随机字符串
  8. 基于电子病历的临床医疗大数据挖掘流程与方法
  9. 提前还房贷需三思 专家建议两类人可提前还款
  10. mysql主备方案_Mysql 主备双库方案