码迷,mamicode.com
首页 > 其他好文 > 详细

hdu2874(tarjan)

时间:2017-04-30 21:28:53      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:using   ace   style   targe   ref   scanf   题目   i++   code   

题目链接: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)

标签:using   ace   style   targe   ref   scanf   题目   i++   code   

原文地址:http://www.cnblogs.com/yijiull/p/6790320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!