hdu 2586 Tarjan離線

參考上一篇文章。這題建圖有點不知道怎麼下手,稀裏糊塗也過了。

現在想想Tarjan離線就是DFS+並查集,不難

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

#define M 40001
#define Q 200

int n, q;

typedef struct _Node{
	int dis;
	int v;
	struct _Node* next;
}Node, *pNode;

pNode map[M];
int len[M];

typedef struct _Query{
	int s, e;
	int ans;
}Query, *pQuery;

Query que[Q];

int set[M];
int mk[M];

void init(){
	int i;
	for(i=1; i<=n; i++){
		set[i] = i;
	}
}

int find(int u){
	if(set[u]!=u){
		set[u] = find(set[u]);
	}
	return set[u];
}

void combine(int u, int v){
	set[v] = u;
}

void LCA(int u){
	int i, t;
	pNode r=map[u];
	while(r && !mk[r->v]){
		len[r->v] = len[u] + r->dis;
		LCA(r->v);
		combine(u, r->v);
		r = r->next;
	}
	mk[u] = 1;
	for(i=0; i<q; i++){
		t = -1;
		if(u==que[i].s && mk[que[i].e])
			t = que[i].e;
		else if(u==que[i].e && mk[que[i].s])
			t = que[i].s;
		if(t!=-1)
			que[i].ans = find(t);
	}
}

void clean(){
	int i;
	pNode t;
	for(i=0; i<n; i++){
		while(map[i]){
			t = map[i];
			map[i] = t->next;
			free(t);
		}
	}
}

void main(){
	int c, i;
	int u, v, dis;
	pNode t;

	freopen("in.txt", "r", stdin);

	scanf("%d", &c);
	while(c--){
		scanf("%d %d", &n, &q);
		memset(map, 0, sizeof(map));
		for(i=0; i<n-1; i++){
			scanf("%d %d %d", &u, &v, &dis);
			if(v<u) u ^= v  ^= u ^= v;
			t = (pNode)malloc(sizeof(Node));
			t->dis = dis;
			t->v = v;
			t->next = map[u];
			map[u] = t;
		}
		for(i=0; i<q; i++){
			scanf("%d %d", &(que[i].s), &(que[i].e));
		}
		memset(len, 0x7F, sizeof(len));
		memset(mk, 0, sizeof(mk));
		init();
		len[1] = 0;
		LCA(1);
		for(i=0; i<q; i++){
			printf("%d\n", len[que[i].s]+len[que[i].e]-2*len[que[i].ans]);
		}
		clean();
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章