hdu2874 Connections between cities(LCA,并查集同时判断连通)
求任意两点之间的最短距离,不连通的话输出不连通。
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define MAXN 10001
#define MAXQ 1000000
int N,bcnt,father[MAXN],ance[MAXN],dis[MAXN],res[MAXQ];
struct ENode
{
int adv,dis;
};
struct QNode
{
int adv,idx;
};
vector<ENode> adjlist[MAXN];
vector<QNode> query[MAXN];
bool visited[MAXN];
int color[MAXN];
int find_mfs(int x)
{
int i,t;
for(i=x;father[i]>0;i=father[i]) ;
while(x!=i)
{
t=father[x];
father[x]=i;
x=t;
}
return i;
}
void merge_mfs(int x,int y)
{
int fx,fy;
fx=find_mfs(x);
fy=find_mfs(y);
if(fx==fy) return;
if(father[fx]>father[fy]) //-3>-4
{
father[fy]+=father[fx];
father[fx]=fy;
}
else
{
father[fx]+=father[fy];
father[fy]=fx;
}
}
void lca_tarjan(int u,int d)
{
// father[u]=-1;
ance[u]=u;
visited[u]=true;
dis[u]=d;
for(size_t j=0;j<adjlist[u].size();j++)
{
int v=adjlist[u][j].adv;
if(!visited[v])
{
lca_tarjan(v,d+adjlist[u][j].dis);
merge_mfs(u,v);
ance[find_mfs(u)]=u;
}
}
color[u]=bcnt;
for(size_t k=0;k<query[u].size();k++)
{
int w=query[u][k].adv;
if(color[w])
{
if(color[w]==bcnt)
{
int x=ance[ find_mfs(w) ];
res[query[u][k].idx]=dis[u]+dis[w]-2*dis[x];
}
else res[ query[u][k].idx ]=-1;
}
}
}
int main()
{
int M,Q,i,j,k,d;
ENode e;
QNode q;
while(scanf("%d %d %d",&N,&M,&Q)!=EOF)
{
for(i=1;i<=N;i++)
{
father[i]=-1;
visited[i]=false;
color[i]=0;
adjlist[i].clear();
query[i].clear();
}
for(k=0;k<M;k++)
{
scanf("%d %d %d",&i,&j,&d);
e.adv=j;
e.dis=d;
adjlist[i].push_back(e);
e.adv=i;
adjlist[j].push_back(e);
}
for(k=0;k<Q;k++)
{
scanf("%d %d",&i,&j);
q.adv=j;
q.idx=k;
query[i].push_back(q);
q.adv=i;
query[j].push_back(q);
}
bcnt=0;
for(i=1;i<=N;i++)
if(!visited[i])
{
bcnt++;
lca_tarjan(i,0);
}
for(k=0;k<Q;k++)
{
if(res[k]!=-1) printf("%d\n",res[k]);
else printf("Not connected\n");
}
}
return 0;
}
浙公网安备 33010602011771号