设为首页 加入收藏

TOP

POJ 3411-Paid Roads(状态压缩+dijkstra算法+floyd-warshall算法)
2015-07-20 17:14:44 来源: 作者: 【 】 浏览:2
Tags:POJ 3411-Paid Roads 状态 压缩 dijkstra 算法 floyd-warshall

题目大意:给出一张有向图,求点1到点N的最短路,不同的是,对于每一条边,除了源点目标点和花费以外,还有额外点c,若走这条边之前到达过c点,花费会减少到另一个值P。如果最短路不存在,输出impossible。


先用floyd-warshall算法判断连通性,此时忽略额外的c和P。

然后用dijkstra算法,用d[i][S]表示在点i且经过了S集合的点的最短路,将每一个d[i][S]都看成一个点,用dijkstra算法计算。


#include
  
   
#include
   
     #include
    
      #include
     
       using namespace std; const int INF=(1<<29); struct edge { int from; int to; int sit; int dis1; int dis2; }; struct heapnode { int di; int num1; int num2; bool operator< (const heapnode j) const { return di>j.di; } }; edge e[15]; int d[15][1100]; int con[15][15]; int use[15][1100]; int m,n; void dijkstra(int s); void floyd_warshall(void); int main(void) { int i,j,u,p,ans; while(scanf("%d%d",&n,&m)==2) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { con[i][j]=(i==j)?1:0; } } for(i=1;i<=m;i++) { scanf("%d%d%d%d%d",&e[i].from,&e[i].to,&e[i].sit,&e[i].dis2,&e[i].dis1); con[e[i].from][e[i].to]=1; } floyd_warshall(); if(con[1][n]==0) { printf("impossible\n"); } else { dijkstra(1); ans=INF; u=(1<<(n-1)); p=(1<
      
        heap; p=(1<
       
        

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇BZOJ 3878 Ahoi2014 奇怪的计算器.. 下一篇Codeforces Round #294 (Div. 2) ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·【C语言】动态内存管 (2025-12-27 06:23:20)
·C语言中的内存管理 - (2025-12-27 06:23:16)
·C语言指南:C语言内 (2025-12-27 06:23:14)
·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)