博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级( 最短路 )
阅读量:4950 次
发布时间:2019-06-11

本文共 2581 字,大约阅读时间需要 8 分钟。

最短路...多加一维表示更新了多少条路

----------------------------------------------------------------------------------

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<iostream>
 
#define rep( i , n ) for( int i = 0 ; i < n ; i++ )
#define clr( x , c ) memset( x , c , sizeof( x ) )
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 10000 + 5;
const int maxm = 50000 + 5;
const int maxk = 20 + 5;
const ll INF = 1LL << 50;
 
struct edge {
int to , dist;
edge* next;
};
 
edge* pt , EDGE[ maxm << 1 ];
edge* head[ maxn ];
 
void init() {
pt = EDGE;
clr( head , 0 );
}
 
inline void add( int u , int v , ll d ) {
pt -> to = v;
pt -> dist = d;
pt -> next = head[ u ];
head[ u ] = pt++;
}
 
#define add_edge( u , v , d ) add( u , v , d ) , add( v , u , d )
 
ll d[ maxn ][ maxk ];
 
int n , K;
 
struct Node {
int x , k;
ll d;
bool operator < ( const Node &o ) const {
return d > o.d;
}
};
 
priority_queue< Node > Q;
 
void dijkstra() {
rep( i , n ) {
   if( i ) 
   
   rep( j , K ) d[ i ][ j ] = INF;
   
else 
   rep( j , K )
       d[ 0 ][ i ] = 0 , Q.push( ( Node ) { 0 , j , 0 } );
       
}
while( ! Q.empty() ) {
Node o = Q.top();
Q.pop();
int x = o.x , k = o.k;
ll dist = o.d;
if( dist != d[ x ][ k ] ) continue;
for( edge* e = head[ x ] ; e ; e = e -> next ) {
int to = e -> to;
if( d[ to ][ k ] > dist + e -> dist ) {
d[ to ][ k ] = dist + e -> dist;
Q.push( ( Node ) { to , k , d[ to ][ k ] } );
}
if( k + 1 < K && d[ to ][ k + 1 ] > dist ) {
d[ to ][ k + 1 ] = dist;
Q.push( ( Node ) { to , k + 1 , dist } );
}
}
}
}
int main() {
//
freopen( "test.in" , "r" , stdin );
init();
int m;
cin >> n >> m >> K;
K++;
while( m-- ) {
int u , v , d;
scanf( "%d%d%d" , &u , &v , &d );
u-- , v--;
add_edge( u , v , d );
}
dijkstra();
ll ans = INF;
rep( i , K )
   ans = min( ans , d[ n - 1 ][ i ] );
   
cout << ans << "\n";
return 0;
}

 

---------------------------------------------------------------------------------- 

1579: [Usaco2009 Feb]Revamping Trails 道路升级

Time Limit: 10 Sec  
Memory Limit: 64 MB
Submit: 1378  
Solved: 374
[ ][ ][ ]

Description

每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N; 1 <= P2_i<= N). John需要T_i (1 <= T_i <= 1,000,000)时间单位用道路i从P1_i走到P2_i或者从P2_i 走到P1_i 他想更新一些路经来减少每天花在路上的时间.具体地说,他想更新K (1 <= K <= 20)条路经,将它们所须时间减为0.帮助FJ选择哪些路经需要更新使得从1到N的时间尽量少.

Input

* 第一行: 三个空格分开的数: N, M, 和 K * 第2..M+1行: 第i+1行有三个空格分开的数:P1_i, P2_i, 和 T_i

Output

* 第一行: 更新最多K条路经后的最短路经长度.

Sample Input

4 4 1
1 2 10
2 4 10
1 3 1
3 4 100

Sample Output

1

HINT

K是1; 更新道路3->4使得从3到4的时间由100减少到0. 最新最短路经是1->3->4,总用时为1单位. N<=10000

Source

 

转载于:https://www.cnblogs.com/JSZX11556/p/4561847.html

你可能感兴趣的文章
Ajax辅助方法
查看>>
Python模块调用
查看>>
委托的调用
查看>>
c#中从string数组转换到int数组
查看>>
Scrapy入门程序点评
查看>>
DotNetty网络通信框架学习之源码分析
查看>>
8.1 Android Basic 数据存储 Preferences Structured(分组的Preferences)
查看>>
原因和证明
查看>>
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>
Does not contain a valid host;port authority解决方法
查看>>
JAVA程序猿怎么才干高速查找到学习资料?
查看>>
使用axel下载百度云文件
查看>>
Qt中图像的显示与基本操作
查看>>
详解软件工程之软件测试
查看>>
WCF(二) 使用配置文件实现WCF应用程序
查看>>
【CodeForces 803 C】Maximal GCD(GCD+思维)
查看>>
python 去掉换行符或者改为其他方式结尾的方法(end='')
查看>>
数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
查看>>
REST构架风格介绍:状态表述转移
查看>>