【POJ 3255】Roadblocks 【次短路】
2016-11-07 12:00
387 查看
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<queue> using namespace std; #define N 100010 int n,r,eid,head ; struct Edge{ int to,w,next; }e[N<<1]; inline void adde(int u,int v,int w){ e[++eid].to=v;e[eid].w=w;e[eid].next=head[u];head[u]=eid; } int dis ,dis2 ;bool inq ; queue<int> q; void SPFA(){ q.push(1); dis[1]=0;//注意初始化 int u,v; while(!q.empty()){ u = q.front();q.pop(); inq[u] = false; for(int i=head[u];~i;i=e[i].next){ v = e[i].to; if(dis[v]>dis[u]+e[i].w){ dis2[v] = dis[v]; dis[v] = dis[u]+e[i].w; if(!inq[v]){ q.push(v); inq[v] = true; } } else if(dis2[v]>dis[u]+e[i].w&&dis[v]<dis[u]+e[i].w){ dis2[v] = dis[u]+e[i].w; if(!inq[v]){ q.push(v); inq[v] = true; } } if(dis2[v]>dis2[u]+e[i].w){ dis2[v] = dis2[u]+e[i].w; if(!inq[v]){ q.push(v); inq[v] = true; } } } } if(dis2 ==0x3f3f3f3f)dis2 =-1; } int main(){ memset(head,-1,sizeof(head)); memset(dis,0x3f,sizeof(dis)); memset(dis2,0x3f,sizeof(dis)); int a,b,c; scanf("%d%d",&n,&r); for(int i=1;i<=r;i++){ scanf("%d%d%d",&a,&b,&c); adde(a,b,c);adde(b,a,c); } SPFA(); printf("%d",dis2 ); return 0; }
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<queue> using namespace std; #define N 100010 int n,r,eid,head ; struct Edge{ int to,w,next; }e[N<<1]; inline void adde(int u,int v,int w){ e[++eid].to=v;e[eid].w=w;e[eid].next=head[u];head[u]=eid; } int dis ,dis2 ; typedef pair<int,int> pii; priority_queue<pii,vector<pii>,greater<pii> >q; #define mk(a,b) make_pair(a,b) void dijkstra(){ dis[1] = 0; q.push(mk(0,1)); pii p;int u,v,d; while(!q.empty()){ p = q.top();q.pop(); u = p.second,d = p.first;//此处中first的值有意义,不能直接用dis[u] if(p.first>dis2[u])continue; for(int i=head[u];~i;i=e[i].next){ v = e[i].to; if(dis[v]>d+e[i].w){ dis2[v] = dis[v]; dis[v] = d+e[i].w; q.push(mk(dis[v],v)); } else if(dis2[v]>d+e[i].w&&dis[v]<d+e[i].w){ dis2[v] = d+e[i].w; q.push(mk(dis2[v],v)); } } } } int main(){ memset(head,-1,sizeof(head)); memset(dis,0x3f,sizeof(dis)); memset(dis2,0x3f,sizeof(dis)); int a,b,c; scanf("%d%d",&n,&r); for(int i=1;i<=r;i++){ scanf("%d%d%d",&a,&b,&c); adde(a,b,c);adde(b,a,c); } dijkstra(); printf("%d",dis2 ); return 0; }
相关文章推荐
- poj 3255 Roadblocks(spfa次短路 || Dijsktra)
- [POJ 3255]Roadblocks[dijkstra][次短路]
- POJ 3255 Roadblocks——次短路
- POJ 3255 Roadblocks 【次短路】
- POJ 3255 Roadblocks (次短路问题)
- POJ 3255 Roadblocks(Dijstra 求次短路长度)
- POJ3255 - Roadblocks - 次短路(spfa+LLL优化)
- POJ 3255 - Roadblocks(次短路)
- POJ3255-Roadblocks-dijkstra求次短路
- poj 3255 Roadblocks(无向图次短路 SPFA)
- POJ 3255 Roadblocks(A*求次短路)
- POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks
- POJ 3255 Roadblocks --次短路径
- poj 3255 Roadblocks
- MST:Roadblocks(POJ 3255)
- POJ 3255 Roadblocks Dijkstra 算法变形
- POJ - 3255 - Roadblocks(Dijkstra)
- POJ 3255 Roadblocks
- Roadblocks POJ - 3255 (次段路)
- POJ - 3255 Roadblocks —— 次短路