首页 > 代码库 > HDU 2874
HDU 2874
简单的tarjan
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define N 10010#define M 20010#define C 2001000using namespace std;struct edge{ int v,c; int next;}City[M];struct query{ int v,index; int next;}Query[C];int ctot,qtot;int chead[N],qhead[N];int fa[N];int Value[N];int ans[C/2];int rts[N];void addcedge(int u,int v,int c){ City[ctot].v=v; City[ctot].c=c; City[ctot].next=chead[u]; chead[u]=ctot++;}void addqedge(int u,int v,int c){ Query[qtot].v=v; Query[qtot].index=c; Query[qtot].next=qhead[u]; qhead[u]=qtot++;}int find(int u){ int p=u; while(p!=fa[p]) p=fa[p]; while(u!=p){ int r=fa[u]; fa[u]=p; u=r; } return p;}void Union(int u,int v){ int uf=find(u); int uv=find(v); fa[v]=uf;}void tarjan(int now,int pre,int val,int root){ rts[now]=root; fa[now]=now; Value[now]=val; for(int e=chead[now];e!=-1;e=City[e].next){ int v=City[e].v; if(v==pre) continue; tarjan(v,now,val+City[e].c,root); Union(now,v); } for(int e=qhead[now];e!=-1;e=Query[e].next){ int v=Query[e].v; if(ans[Query[e].index]==-1&&rts[v]==root){ int vf=find(v); ans[Query[e].index]=Value[v]+Value[now]-2*Value[vf]; } }}int main(){ int n,m,c,g; int u,v,q; while(scanf("%d%d%d",&n,&m,&c)!=EOF){ memset(chead,-1,sizeof(chead)); memset(qhead,-1,sizeof(qhead)); memset(fa,-1,sizeof(fa)); memset(Value,0,sizeof(Value)); memset(ans,-1,sizeof(ans)); memset(rts,0,sizeof(rts)); ctot=qtot=0; for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&g); addcedge(u,v,g); addcedge(v,u,g); } for(int i=1;i<=c;i++){ scanf("%d%d",&u,&v); addqedge(u,v,i); addqedge(v,u,i); } for(int i=1;i<=n;i++){ if(fa[i]==-1) tarjan(i,-1,0,i); } for(int i=1;i<=c;i++){ if(ans[i]!=-1) printf("%d\n",ans[i]); else puts("Not connected"); } } return 0;}
HDU 2874
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。