求最短路即次短路模板,一条边可以重复走的HDU6181
2017-08-25 13:56
274 查看
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<iostream> #include<algorithm> #include<vector> #include<queue> #define MAXSIZE 100010 #define INF 1e18 #define LL long long using namespace std; //int ans,n,k,a[MAXSIZE],dist1[MAXSIZE],dist2[MAXSIZE],vis[MAXSIZE]; int n, k, a[MAXSIZE]; LL ans, dist1[MAXSIZE], dist2[MAXSIZE]; bool vis[MAXSIZE]; typedef pair<LL, int>p;//p.second储存节点:u,p.frist储存s->u的当前最短距离 struct node { int u; int v; LL w; int next; }G[MAXSIZE * 2]; void Add(int u,int v,LL w) { G[k].u=u; G[k].v=v; G[k].w=w; G[k].next=a[u]; a[u]=k++; } void bfs() { priority_queue<p,vector<p>,greater<p> > Q; dist1[1]=0; Q.push(p(0,1)); while(!Q.empty())//可以发现这里没有vis数组, { p k=Q.top(); Q.pop(); int u=k.second; LL d=k.first; if(dist2[u] < d) //小优化:如果取出的不是最短距离就不再向下进行 continue; for(int i=a[u];i!=-1;i=G[i].next) { int v=G[i].v; LL d2=d+G[i].w; if(dist1[v] > d2) //更新最短路 { swap(dist1[v],d2); Q.push(p(dist1[v],v)); } if(dist2[v] >= d2 && dist1[v]<=d2)//更新次短路 { dist2[v]=d2; Q.push(p(dist2[v],v)); } } } ans=dist2 ; } void Init() { for(int i=0;i<MAXSIZE;i++) { dist1[i]=INF; dist2[i]=INF; vis[i] = false; a[i]=-1; } k=1; } int main() { int T,u,v,m; LL w; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); Init(); while(m--) { scanf("%d%d%lld",&u,&v,&w); Add(u,v,w); Add(v,u,w); } bfs(); printf("%lld\n", ans); } return 0; }
相关文章推荐
- hdu6181-启发式搜索A*|次短路模板|最短路枚举-Two Paths
- hdu6181 How Many Paths Are There(次短路条数[模板])
- 可以插入重复数据的AVL树模板实现
- 如何删除表中的重复记录只保留其中一条?
- K短路【模板】
- 【最短路+模板题】杭电 hdu 2112 HDU Today
- Android 多线程之可以重复启动与停止的服务
- Oracle 删除重复数据只留一条
- 有1、2、3、4四个数字,可以组成多少个互不相同且无重复的三位数?都是多少?
- 数据库中多条记录有相同数据,可以用函数筛选只查询相同记录中的一条
- Floyd,Dijkstra,SPFA模板整理(以[HDU2544-最短路]为例 )
- 最短路(Dijkstra模板题)
- 随时可以给doT模板传任何你想要的值
- 在List的add方法添加对象时都是最后的一条记录的重复
- HDU 1599 find the mincost route 【最短路之最小环模板】
- 最短路模板
- key可以重复的Map集合:IdentityHashMap
- Oracle 删除重复数据只留一条
- 最短路 dijkstra模板
- 【最短路】CODE[VS] 1557 热浪 (Dijkstra模板)