您的位置:首页 > 其它

【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 次短路