题意:

无向图,求单源次短路,每条边可以走多次。

分析:

对于每个点记录最短路和次短路,次短路可以是由最短路+边或者是次短路+边更新而来。在更新每个点的最短路时,相应更新次短路,如果最短路更新了,就令次短路等于原来的最短路,如果没有,就看能否直接更新次短路。

代码:

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
#define se second
#define fi first
typedef pair<int, int>pii;
struct edge{int to,w,next;};
const int maxm = 200010, maxn = 5005, INF = 0x3fffffff;
edge e[maxm];
int n,R;
int head[maxn], d[maxn], d2[maxn];
int dijkstra()
{
priority_queue<pii,vector<pii>,greater<pii> > q;
q.push(pii(0,1));
fill(d, d+n+1, INF);
fill(d2, d2+n+1, INF);
d[1] = 0;
while(!q.empty()){
pii tmp = q.top();q.pop();
int ne = head[tmp.se];
while(ne!=-1){
int v = e[ne].to;
int di = e[ne].w+tmp.fi;
int temp =di;
if(d[v] > di){
temp = d[v];
d[v]=di;
q.push(make_pair(d[v],v));
}
if(d2[v] > temp){
d2[v] = temp;
q.push(make_pair(d2[v],v));
}
ne = e[ne].next;
}
}
return d2[n];
}
int main (void)
{
scanf("%d%d",&n,&R);
int a, b, di;
fill(head, head+n+1,-1);
for(int i = 0; i < 2 * R; i++){
scanf("%d%d%d",&a,&b,&di);
e[i].to = b, e[i].w = di;
e[i].next = head[a];
head[a] = i++;
e[i].to = a, e[i].w = di;
e[i].next = head[b];
head[b] = i;
}
printf("%d\n",dijkstra());
}

看discuss有人说是道大水题,可是我感觉还不是很好想,可能还是对算法本身理解不彻底掌握不扎实吧。

POJ 3255_Roadblocks的更多相关文章

  1. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  2. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  3. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  4. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  5. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  6. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  7. POJ 2255. Tree Recovery

    Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11939   Accepted: 7493 De ...

  8. POJ 2752 Seek the Name, Seek the Fame [kmp]

    Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17898   Ac ...

  9. poj 2352 Stars 数星星 详解

    题目: poj 2352 Stars 数星星 题意:已知n个星星的坐标.每个星星都有一个等级,数值等于坐标系内纵坐标和横坐标皆不大于它的星星的个数.星星的坐标按照纵坐标从小到大的顺序给出,纵坐标相同时 ...

随机推荐

  1. PHP PDO事务处理及MYSQLengine=InnoDB

    如果出现“#skip-innodb”则将“#”去掉,重启MySQL: 如果第一条无法解决,加上配置:default-storage-engine=InnoDB 再重启MySQL. 进入MYsql数据据 ...

  2. Android开源项目:GifView——Android显示GIF动画

    下载:http://code.google.com/p/gifview/downloads/list 简介:android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常 ...

  3. Java集合框架源码(三)——arrayList

    1. ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部 ...

  4. sql创建发送邮件账号

    ALTER PROCEDURE dbo.sx_pro_autoEmail_account AS begin Declare @my_profile_name varchar(50) Declare @ ...

  5. mongodb用户权限管理(二)

    数据库 分配用户权限 有了创建语法,和参数说明,接下来开始实践. 注意,还有一点,账号是跟着数据库绑定的,在那个库里授权,就在那个库里验证(auth) 否则会失败 创建 账号管理授权权限 的账号 &g ...

  6. js面向对象之构造函数

    最简单的面向对象程序<script type="text/javascript"> var obj = new Object(); obj.qq = '10791611 ...

  7. 无聊的我写了一个代码 。。。P1605 迷宫

    搜索水题 哎 直接不行了 . #include <ctype.h> #include <cstdio> void read(int &x) { x=;char ch=g ...

  8. druid数据库连接池整合到SpringMvc

    1.maven项目加入相关的依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>dru ...

  9. 【HTML5】可以省略标记的元素

  10. 08C++函数

    函数 4.1 概述 一个较大的程序不可能完全由一个人从头至尾地完成,更不可能把所有的内容都放在一个主函数中.为了便于规划.组织.编程和调试,一般的做法是把一个大的程序划分为若干个程序模块(即程序文件) ...