zoukankan      html  css  js  c++  java
  • HDU 2874

    简单的tarjan

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    #define N 10010
    #define M 20010
    #define C 2001000
    using namespace std;
    
    struct edge{
    	int v,c;
    	int next;
    }City[M];
    
    struct query{
    	int v,index;
    	int next;
    }Query[C];
    int ctot,qtot;
    int chead[N],qhead[N];
    int fa[N];
    int Value[N];
    int ans[C/2];
    int rts[N];
    
    void addcedge(int u,int v,int c){
    	City[ctot].v=v;
    	City[ctot].c=c;
    	City[ctot].next=chead[u];
    	chead[u]=ctot++;
    }
    
    void addqedge(int u,int v,int c){
    	Query[qtot].v=v;
    	Query[qtot].index=c;
    	Query[qtot].next=qhead[u];
    	qhead[u]=qtot++;
    }
    
    int find(int u){
    	int p=u;
    	while(p!=fa[p])
    	p=fa[p];
    	while(u!=p){
    		int r=fa[u];
    		fa[u]=p;
    		u=r;
    	}
    	return p;
    }
    
    void Union(int u,int v){
    	int uf=find(u);
    	int uv=find(v);
    	fa[v]=uf;
    }
    
    void tarjan(int now,int pre,int val,int root){
    	rts[now]=root;
    	fa[now]=now;
    	Value[now]=val;
    	for(int e=chead[now];e!=-1;e=City[e].next){
    		int v=City[e].v;
    		if(v==pre) continue;
    		tarjan(v,now,val+City[e].c,root);
    		Union(now,v);
    	}
    	for(int e=qhead[now];e!=-1;e=Query[e].next){
    		int v=Query[e].v;
    		if(ans[Query[e].index]==-1&&rts[v]==root){
    			int vf=find(v);
    			ans[Query[e].index]=Value[v]+Value[now]-2*Value[vf];
    		}
    	}
    }
    
    int main(){
    	int n,m,c,g; int u,v,q;
    	while(scanf("%d%d%d",&n,&m,&c)!=EOF){
    		memset(chead,-1,sizeof(chead));
    		memset(qhead,-1,sizeof(qhead));
    		memset(fa,-1,sizeof(fa));
    		memset(Value,0,sizeof(Value));
    		memset(ans,-1,sizeof(ans));
    		memset(rts,0,sizeof(rts));
    		ctot=qtot=0;
    		for(int i=1;i<=m;i++){
    			scanf("%d%d%d",&u,&v,&g);
    			addcedge(u,v,g);
    			addcedge(v,u,g);
    		}
    		for(int i=1;i<=c;i++){
    			scanf("%d%d",&u,&v);
    			addqedge(u,v,i);
    			addqedge(v,u,i);
    		}
    		for(int i=1;i<=n;i++){
    			if(fa[i]==-1)
    			tarjan(i,-1,0,i);
    		}
    		for(int i=1;i<=c;i++){
    			if(ans[i]!=-1)
    			printf("%d
    ",ans[i]);
    			else puts("Not connected");
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    第十六周个人作业
    小组作业
    第十五周个人作业
    本周个人总结
    产品计划会议
    本周个人总结
    排球计分程序
    JProfiler入门
    (转)MMOGS服务器架构设计
    (转)游戏服务器开发需要学习的技术
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4148402.html
Copyright © 2011-2022 走看看