POJ-3255-Roadblocks
2014-07-24 00:12
134 查看
这个题是要求求出次短路径,其实可以先求出最短路径,然后枚举除了最短路径外的边,改变一条求最小的即是次短路径
代码:
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; const int inf=1<<29; const int maxn=5e3+100; const int maxm=2e5+100; int n,m,e,head[maxn],nxt[maxm],cost[maxm],pnt[maxm],dist[maxn][2]; bool vis[maxn]; queue<int> q; void AddEdge(int u,int v,int c) { pnt[e]=v;nxt[e]=head[u];cost[e]=c;head[u]=e++; pnt[e]=u;nxt[e]=head[v];cost[e]=c;head[v]=e++; } void Spfa(int st,int des,int pos) { for(int i=0;i<=n;i++) dist[i][pos]=inf; dist[st][pos]=0; q.push(st); while(!q.empty()) { int u=q.front(); vis[u]=0; q.pop(); for(int i=head[u];i!=-1;i=nxt[i]) if(dist[pnt[i]][pos]>dist[u][pos]+cost[i]) { dist[pnt[i]][pos]=dist[u][pos]+cost[i]; if(!vis[pnt[i]]) { q.push(pnt[i]); vis[pnt[i]]=1; } } } } void solve() { int ans=inf; Spfa(1,n,0); Spfa(n,1,1); for(int i=0;i<e;i++) if(dist[pnt[i^1]][0]+dist[pnt[i]][1]+cost[i]!=dist [0]) { ans=min(ans,dist[pnt[i^1]][0]+cost[i]+dist[pnt[i]][1]); } printf("%d\n",ans); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { e=0; memset(head,-1,sizeof(head)); for(int i=0;i<m;i++) { int u,v,c; scanf("%d%d%d",&u,&v,&c); AddEdge(u,v,c); } solve(); } return 0; }
相关文章推荐
- POJ 3255 Roadblocks
- poj 3255 Roadblocks(次短路)
- POJ - 3255 Roadblocks(最短路Dijkstra算法求次最短路)
- poj3255-Roadblocks-次短路
- POJ-3255 Roadblocks
- POJ 3255 Roadblocks (次短路)
- POJ 3255 Roadblocks
- POJ - 3255 Roadblocks (次短路)
- poj 3255 Roadblocks (次短路+dijkstra)
- poj 3255 Roadblocks
- POJ 3255 Roadblocks 次短路
- POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks
- POJ3255 Roadblocks
- POJ 3255 Roadblocks
- POJ 3255 Roadblocks【次短路】
- poj3255——Roadblocks
- POJ 3255 Roadblocks 次短路
- poj 3255 Roadblocks(次短路板子题)
- POJ 3255 Roadblocks (次短路径 + Dijkstra算法)
- POJ 3255 RoadBlocks(次短路+dijkstra变形)