原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874
题意:n个村,m条路,数据保证无环路,但并不是任两个村子都有路可连通,k条查询a和b两个村子距离。
分析:是个模板题,注意查询可能是相同的两个村子,也就是可能是1 1或者2 2,,,,等等的,那么距离肯定是0,所以这里数据要注意处理。
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#define INF 99999999
#define eps 0.0001
#define N ((1<<12)+10)
using namespace std;
struct Edge
{
int v;
int w;
int next;
};
struct Query
{
int v;
int index;
int next;
};
int n, m, k;
int cnt;
int q_cnt;
Edge edge[20005];
Query query[2000005];
int z[1000005];
int head[10005];
int q_head[10005];
int dis[10005];
int pre[10005];
bool vis[10005];
void init()
{
q_cnt = 0;
cnt = 0;
memset(vis, 0, sizeof(vis));
memset(z, -1, sizeof(z));//赋值-1
memset(dis, 0, sizeof(dis));
memset(head, -1, sizeof(head));
memset(q_head, -1, sizeof(q_head));
memset(pre, 0, sizeof(pre));
}
void add(int u, int v, int w)
{
edge[cnt].v = v; edge[cnt].w = w; edge[cnt].next = head[u]; head[u] = cnt++;
edge[cnt].v = u; edge[cnt].w = w; edge[cnt].next = head[v]; head[v] = cnt++;
}
void q_add(int u, int v, int index)
{
query[q_cnt].v = v; query[q_cnt].index = index; query[q_cnt].next = q_head[u]; q_head[u] = q_cnt++;
query[q_cnt].v = u; query[q_cnt].index = index; query[q_cnt].next = q_head[v]; q_head[v] = q_cnt++;
}
int find(int x)
{
if (x == pre[x])
return x;
return pre[x] = find(pre[x]);
}
void tarjan(int u)
{
pre[u] = u;
vis[u] = 1;
for (int i = q_head[u]; i != -1; i = query[i].next)
{
int v = query[i].v;
if (vis[v])
z[query[i].index] = dis[u] + dis[v] - 2 * dis[find(v)];
}
for (int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if (!vis[v])
{
dis[v] = dis[u] + edge[i].w;
tarjan(v);
pre[v] = u;
}
}
}
int main()
{
while (~scanf("%d%d%d", &n, &m, &k))
{
init();
int u, v, w;
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}
for (int i = 0; i < k; i++)
{
scanf("%d%d", &u, &v);
q_add(u, v, i);
}
for (int i = 1; i <= n; i++)
if (dis[i] == 0)
{
memset(vis, 0, sizeof(vis));
tarjan(i);
}
for (int i = 0; i < k; i++)
{
if (z[i] == -1)
printf("Not connected\n");
else
printf("%d\n", z[i]);
}
}
return 0;
}