zoukankan      html  css  js  c++  java
  • 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
    ",ans[i]);
    108         }
    109     }
    110 }
  • 相关阅读:
    图标字体化浅谈
    HTML5 data-* 自定义属性
    NodeJS初识
    [转]响应式web设计之CSS3 Media Queries
    [转]移动端web页面使用字体的思考
    运用@media实现网页自适应中的几个关键分辨率
    不同内核浏览器的差异以及浏览器渲染简介
    动画库tween.js
    ORACLE查看表空间使用率
    oracle存储过程游标循环
  • 原文地址:https://www.cnblogs.com/yijiull/p/6790320.html
Copyright © 2011-2022 走看看