poj 3255次短路(暴力法)

来源:互联网 发布:数据统计 编辑:程序博客网 时间:2024/06/03 20:30
点击打开链接

http://poj.org/problem?id=3255


#include <iostream>#include <vector>#include <algorithm>#include <queue>#include <cstdio>#include <cstring>#define M 5010#define Me 200005const int Inf=1000001000;using namespace std;struct edge{edge(int a,int b) {to=a; cost=b;}int to;int cost;};vector<edge> g[Me]; // 邻接表 typedef pair<int ,int> P; //  first 距离 sec编号 队列中元素 int dist1[M],dist2[M];long n,r;typedef struct{int x;int y;int cost;}Edg;Edg E[Me];void dijkstra(int s,int *dist){int i,j;priority_queue<P,vector<P>,greater<P> > que;dist[s]=0;que.push(P(0,s));for(i=0;i<g[s].size();i++) //初始化队列 {edge e=g[s][i];que.push(P(e.cost,e.to));}while(!que.empty()){P k=que.top();//当前最小的dist[i]  即为源点到i的最短距离 que.pop();                       //当前最小的dist[i] 不会再更小 反证法...@路径递增 int v=k.second;if(dist[v]<k.first) continue;for(i=0;i<g[v].size();i++){edge e=g[v][i];if(dist[e.to]>dist[v]+e.cost){dist[e.to]=dist[v]+e.cost;que.push(P(dist[e.to],e.to));}}}}int main(){int i,j,a,b,c,k;fill(dist1,dist1+M,Inf);fill(dist2,dist2+M,Inf);scanf("%ld%ld",&n,&r);k=0;for(i=1;i<=r;i++){scanf("%d%d%d",&a,&b,&c);g[a].push_back(edge(b,c));g[b].push_back(edge(a,c));E[k].x=a;E[k].y=b;E[k].cost=c;k++;E[k].x=b;  //注意双向边 E[k].y=a;E[k].cost=c;k++;}dijkstra(1,dist1);dijkstra(n,dist2);int min2=Inf;         // 如果边在 最短路上则 dist1[x]+x,y+dist2[n]=dist[n]; for(j=0;j<k;j++) //暴力枚举边 如果边不在最短路上 则  dist1[x]+x,y+dist2[n]>dist[n]{////设 x y 是次短路上的一条边 则——> Min(dist1[x]+x,y+dist2[n])>dist[n] //找到不等于dist[n]的最小 x,y 即为次短路i=dist1[E[j].x]+E[j].cost+dist2[E[j].y];if(i!=dist1[n]){min2=min(min2,i);}}cout<<min2<<endl;return 0;}


0 0
原创粉丝点击