您的位置:首页 > 其它

POJ 3255 Roadblocks

2014-12-21 20:34 246 查看
求次短路

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;
#define INF 0xfffffff
#define maxn 5060

struct Edge
{
int e, w;
Edge(int e=0,int w=0): e(e), w(w) {}
};

int n, m;
int dist[2][maxn];
int vis[maxn];

vector<Edge> G[maxn];

void  Spfa(int Star,int k)
{
Edge P, Pn;
queue <Edge> Q;
dist[k][Star] = 0;
Q.push( Edge(Star,0) );

while( !Q.empty() )
{
P = Q.front();
Q.pop();
vis[P.e] = false;
int len = G[P.e].size();

for(int i=0; i<len; i++)
{
Pn = G[P.e][i];

if(dist[k][Pn.e] > dist[k][P.e] + Pn.w )
{
dist[k][Pn.e] = dist[k][P.e] + Pn.w;

if(!vis[Pn.e] )
{
Q.push(Pn);
vis[Pn.e] = true;
}
}
}
}
}
int Slove()
{
int ans = INF;
int Min = dist[0]
;
Edge P;
for(int i=1; i<=n; i++)
{
int len = G[i].size();

for(int j=0; j<len; j++)
{
P = G[i][j];
int temp = dist[0][i] + dist[1][P.e] + P.w;
if(temp > Min && temp < ans)
ans = temp;
}
}
return ans;
}
void Init()
{
for(int i=1; i<=n; i++)
{
G[i].clear();
vis[i] = false;
dist[0][i] = dist[1][i] = INF;
}
}
int main()
{
while(cin >> n >> m)
{
int a, b, c;
Init();
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c);
G[a].push_back( Edge(b,c) );
G[b].push_back( Edge(a,c) );
}

Spfa(1,0);
Spfa(n,1);

int ans = Slove();

cout << ans << endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: