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 }

 

转载于:https://www.cnblogs.com/yijiull/p/6790320.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值