栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1986 Distance Queries

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1986 Distance Queries

#include<string.h>#include<stdio.h>#include<vector>#include<math.h>using namespace std;const int M =40100;const double inf = 1e20;int min(int a,int b){return a<b?a:b;}int n,k,tdfn,tot;int dp[20][2*M],vis[M];int B[2*M],LOG[2*M],used[M],F[2*M],pos[M];vector<pair<int,int> > edge[2*M];void rmq_init(int n,int num[]){    int i,j;    for(j=1;j<=n;j++)         dp[0][j]=num[j];    for(j=1;j<=LOG[n];j++)    {        int limit=n+1-(1<<j);        for(i=1;i<=limit;i++)        { int x=i+(1<<j>>1); dp[j][i]=min(dp[j-1][x],dp[j-1][i]);        }    }}int rmq(int l,int r,int num[]){    int m=LOG[r-l+1];    return min(dp[m][l],dp[m][r-(1<<m)+1]);}int sum[M];void dfs(int s){    int i,t;    used[s]=1;    int tmp=++tdfn;    B[++tot]=tmp;F[tmp]=s;    pos[s]=tot;    for(i=0;i<edge[s].size();i++)    {        t=edge[s][i].first;        if(used[t])  continue;        sum[t]=sum[s]+edge[s][i].second;        dfs(t);        B[++tot]=tmp;//backtrack    }}int lca(int a,int b){    if(pos[a]>pos[b]) swap(a,b);    int ans=rmq(pos[a],pos[b],B);    return F[ans];}int main(){    int i,n,m,a,b,w;    LOG[0]=-1;    for(i=1;i<2*M;i++)  LOG[i]=LOG[i>>1]+1;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=0;i<=n;i++) edge[i].clear();        char str[5];        for(i=0;i<m;i++)        { scanf("%d%d%d%s",&a,&b,&w,str); edge[a].push_back(make_pair(b,w)); edge[b].push_back(make_pair(a,w));        }        sum[1]=0;        tdfn=0;        tot=0;        memset(used,0,sizeof(used));        dfs(1);        rmq_init(tot,B);        scanf("%d",&k);        while(k--)        { scanf("%d%d",&a,&b); printf("%dn",sum[a]+sum[b]-2*sum[lca(a,b)]);        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/379649.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号