poj3255Roadblocks_次短路径

来源:互联网 发布:吉利知豆报价 编辑:程序博客网 时间:2024/06/17 09:32

题目链接

题意:

某街区共有R条道路,N个路。道路可以双向通行。问1号路口到N号路口的次短路长度是多少?次短路指的比最短路路长度长的次短的路径。同一条边可能经过多次。

思路是竟然是次短路,那么就是和最短相差了一条边(这条边是大于最短路径的最小值)多想下,所以一定是经过某一节点的(u,v)的边e(u,v);所以用到了源点到各个点的dis和终点到各个点的dis2;

#include<stdio.h>#include<string.h>#include<queue>#include<vector>using namespace std;#define N 5005int dis[N];int dis2[N];int vis[N];int head[N];int n,r;struct node{int v,w;};vector<node>e[N];void init(){memset(vis,0,sizeof(vis));memset(dis,0x3f,sizeof(dis));memset(dis2,0x3f,sizeof(dis));memset(head,0,sizeof(head));}void spfa(int s,int d[]){int i,u,w,v;queue<int>Q;Q.push(s);vis[s]=1;d[s]=0;while(!Q.empty()){    u=Q.front();Q.pop();vis[u]=0;for(i=0;i<e[u].size();i++){v=e[u][i].v;w=e[u][i].w;if(d[v] > d[u] + w){ d[v]=d[u]+w; if(!vis[v]) { vis[v]=1; Q.push(v); }}  }}}int main() {while(~scanf("%d%d",&n,&r)){init();int u,v,w,i,j;for(i=0;i<r;i++){scanf("%d%d%d",&u,&v,&w);    e[u].push_back((node){v,w});    e[v].push_back((node){u,w});}spfa(1,dis);spfa(n,dis2);int ans=1<<28;for(i=1;i<=n;i++){for(j=0;j<e[i].size();j++){v=e[i][j].v;w=e[i][j].w;int temp=dis[i]+dis2[v]+w;//各个路径 if(temp > dis[n] && temp < ans)//大于最短路径的最小值 {ans=temp;}}}printf("%d\n",ans);}return 0;} 


0 1
原创粉丝点击