首页 > 代码库 > hdu2874(tarjan)
hdu2874(tarjan)
题目链接:HDU - 2874
比较少写tarjan,还要多练习。。。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=10010; 6 const int maxq=1000010; 7 int n,m,k; 8 int u,v,w; 9 struct edge 10 { 11 int v,w; 12 int nex; 13 }e[maxn*2]; 14 struct query 15 { 16 int v; 17 int id; 18 int nex; 19 }q[maxq*2]; 20 int ect,qct; 21 int ehead[maxn]; 22 int qhead[maxn]; 23 int f[maxn],id[maxn],dis[maxn],vis[maxn]; 24 int ans[maxq]; 25 void adde(int u,int v,int w) 26 { 27 e[ect].v=v; 28 e[ect].w=w; 29 e[ect].nex=ehead[u]; 30 ehead[u]=ect++; 31 } 32 void addq(int u,int v,int id) 33 { 34 q[qct].v=v; 35 q[qct].id=id; 36 q[qct].nex=qhead[u]; 37 qhead[u]=qct++; 38 } 39 int gf(int x) 40 { 41 return x==f[x]?x:f[x]=gf(f[x]); 42 } 43 44 void init() 45 { 46 qct=ect=0; 47 memset(qhead,-1,sizeof(qhead)); 48 memset(ehead,-1,sizeof(ehead)); 49 memset(vis,0,sizeof(vis)); 50 } 51 52 void tarjan(int u,int tp) 53 { 54 vis[u]=1; 55 f[u]=u; 56 id[u]=tp; 57 for(int i=qhead[u];i!=-1;i=q[i].nex) 58 { 59 int v=q[i].v; 60 if(vis[v]) 61 { 62 if(id[v]==id[u]) 63 ans[q[i].id]=dis[u]+dis[v]-2*dis[gf(v)]; 64 else 65 ans[q[i].id]=-1; 66 } 67 } 68 for(int i=ehead[u];i!=-1;i=e[i].nex) 69 { 70 int v=e[i].v; 71 if(!vis[v]) 72 { 73 dis[v]=dis[u]+e[i].w; 74 tarjan(v,tp); 75 f[v]=u; 76 } 77 } 78 } 79 80 int main() 81 { 82 int n,m,k; 83 while(scanf("%d%d%d",&n,&m,&k)!=EOF) 84 { 85 init(); 86 for(int i=0;i<m;i++) 87 { 88 scanf("%d%d%d",&u,&v,&w); 89 adde(u,v,w); 90 adde(v,u,w); 91 } 92 for(int i=0;i<k;i++) 93 { 94 scanf("%d%d",&u,&v); 95 addq(u,v,i); 96 addq(v,u,i); 97 } 98 for(int i=1;i<=n;i++) 99 if(!vis[i]) 100 { 101 dis[i]=0; 102 tarjan(i,i); 103 } 104 for(int i=0;i<k;i++) 105 { 106 if(ans[i]==-1) puts("Not connected"); 107 else printf("%d\n",ans[i]); 108 } 109 } 110 }
hdu2874(tarjan)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。