您的位置:首页 > 其它

【bzoj1576/Usaco2009 Jan】安全路经Travel——dijkstra+并查集

2017-09-29 06:44 405 查看

Description

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mem(a,p) memset(a,p,sizeof(a))
const int N=1e5+10,M=2e5+10;
using std::swap;
using std::sort;
struct node{int fr,to,ne,w;}e[M*2],d[M*2];
struct point{
int d,id;
bool operator <(const point&p)const {return p.d<d;}
};
int n,an
,m,first
,dis
,tot=0,fa
,dep
,cnt=0;
std::priority_queue<point>q;
int read(){
int ans=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();}
return ans*f;
}
bool cmp(node a,node b){return a.w<b.w;}
void ins(int u,int v,int w){e[++tot]=(node){u,v,first[u],w};first[u]=tot;}
void dijkstra(){
mem(dis,127);dis[1]=0;q.push((point){0,1});
while(!q.empty()){
point p=q.top();q.pop();
int x=p.id;
for(int i=first[x];i;i=e[i].ne){
int to=e[i].to;
if(dis[to]>dis[x]+e[i].w){
dis[to]=dis[x]+e[i].w;q.push((point){dis[to],to});
dep[to]=dep[x]+1;
fa[to]=x;
}
}
}
}
int f
,ans
;
int getf(int x){
if(f[x]==x)return x;
f[x]=getf(f[x]);
return f[x];
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1,a,b,c;i<=m;i++){
a=read();b=read();c=read();ins(a,b,c);ins(b,a,c);
}
dijkstra();
for(int i=1;i<=tot;i++){
int x=e[i].fr,y=e[i].to;
if(dep[x]<dep[y])swap(x,y);
if(dis[x]==dis[y]+e[i].w)continue;
d[++cnt]=(node){x,y,0,e[i].w+dis[x]+dis[y]};
}
sort(d+1,d+1+cnt,cmp);
for(int i=1;i<=cnt;i++){
int x=d[i].fr,y=d[i].to;
x=getf(x),y=getf(y);
while(x!=y){
if(dep[x]<dep[y])swap(x,y);
if(!ans[x])ans[x]=d[i].w-dis[x];
x=f[x]=getf(fa[x]);
}
}
for(int i=2;i<=n;i++){
if(!ans[i])printf("-1\n");
else printf("%d\n",ans[i]);
}
return 0;
}
bzoj1576  

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