PKU 3255 Roadblocks
来源:互联网 发布:北京 学编程 编辑:程序博客网 时间:2024/06/05 22:41
题目要求次短路径,每条路可以走多次。
本题的实现方法是分别对1和n进行两次Dijkstra,然后枚举边,产生新的一条路,即两点分别到1和n的距离和加上这条边的距离。如果这样计算后不存在次短路径,那么答案就是 (最短路径+2*最短的边长)。
#include <stdio.h>
const int R = 100000+5;
const int N = 5000+ 5;
const int MAX = 1<<30;
struct Line{
int s, t;
int len;
}line[R];
struct Link{
int t;
int len;
Link *next;
};
struct Node{
Link head;
void Insert( int t, int len ){
Link *p = new Link();
p->t = t; p->len = len;
p->next = head.next;
head.next = p;
}
}node[N];
void Dijkstra( int n, int source, int* d )
{
int flag[N] = {0} ;
int i, j;
for ( i=0; i<n; i++ )
d[i] = MAX;
d[source] = 0;
for ( i=0; i<n; i++ )
{
int min = 0;
int p = 0;
for ( j=0; j<n; j++ )
{
if ( (flag[j]==0 ) && (p==0 || d[j]<d[min]) )
{
p = 1;
min = j;
}
}
flag[min] = 1;
Link *tmp = node[min].head.next;
for ( ; tmp!=NULL; tmp=tmp->next )
{
if ( d[tmp->t]>d[min]+tmp->len )
d[tmp->t] = d[min]+tmp->len;
}
}
}
int dis0[N];
int disn[N];
int minRoad;
void Find( int n, int r )
{
int i;
int minLen = dis0[n-1];
int secLen = MAX;
for ( i=0; i<r; i++ )
{
int cur = dis0[line[i].s] + disn[line[i].t] + line[i].len;
if ( cur<secLen && cur>minLen )
secLen = cur;
cur = dis0[line[i].t] + disn[line[i].s] + line[i].len;
if ( cur<secLen && cur>minLen )
secLen = cur;
}
if ( secLen==MAX )
printf("%d/n", minLen+2*minRoad );
else
printf("%d/n", secLen );
}
int main ()
{
int n, r;
int i;
scanf("%d %d", &n, &r );
minRoad = MAX;
for ( i=0; i<r; i++ )
{
scanf("%d %d %d", &line[i].s, &line[i].t, &line[i].len );
line[i].s--;line[i].t--;
if ( line[i].len<minRoad )
minRoad = line[i].len;
node[line[i].s].Insert( line[i].t, line[i].len );
node[line[i].t].Insert( line[i].s, line[i].len );
}
Dijkstra( n, 0, dis0 );
Dijkstra( n, n-1, disn );
Find( n, r );
return 0;
}
- PKU 3255 Roadblocks
- poj 3255 Roadblocks
- poj 3255 Roadblocks
- POJ-3255-Roadblocks
- POJ 3255 Roadblocks
- POJ 3255 Roadblocks
- poj 3255 Roadblocks
- POJ 3255 Roadblocks
- poj 3255 Roadblocks
- POJ 3255 Roadblocks
- POJ 3255 Roadblocks
- POJ-3255-Roadblocks
- poj 3255 Roadblocks
- poj 3255 Roadblocks
- POJ 3255 Roadblocks
- POJ 3255 Roadblocks
- POJ-3255 Roadblocks
- poj 3255 Roadblocks
- ACM练习时为什么要写int main()后面还要跟个return 0;的疑问。
- 虚拟化概述——研读历程
- 用Delphi编写一个Svchost.exe调用的DLL模块
- TD能扛住WCDMA的冲击吗?
- 电子工程师必上的十大专业网站
- PKU 3255 Roadblocks
- 今天的java学习
- PKU 3254 Corn Fields
- kab12.dll 病毒的分析
- SuperRuntimeLibrary.GameEngine 技术预览
- JSP+JavaBean+Servlet实现分页
- Solaris 10的认识
- Oracle11g 新特性更适合中型企业
- 中移动加入TD联盟详情:从责无旁贷到全力以赴