tarjan详解:https://user.qzone.qq.com/50222268/blog/1504145322
注意:离线存储用vector存
1,题目:http://codevs.cn/problem/2370/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
struct node
{
int y,wei;
};
struct node1
{
int y,ans;
};
const int maxSize=75000;
vector <node> N[maxSize+5];
vector <node1> M[maxSize+5];
int n,m;
int ans[maxSize+5],vis[maxSize+5],visit[maxSize+5],fa[maxSize+5],dis[maxSize+5];
int find(int x)
{
int r=x,temp;
while (fa[r]!=r)
{
r=fa[r];
}
while (fa[x]!=r)
{
temp=fa[x];
fa[x]=r;
x=temp;
}
return r;
}
void dfs1(int x)
{
int i;
node n1;
for (i=0;i<N[x].size();i++)
{
n1=N[x][i];
if (vis[n1.y]==1)
continue;
vis[n1.y]=1;
dis[n1.y]=dis[x]+n1.wei;
dfs1(n1.y);
vis[n1.y]=0;
}
}
void dfs(int x)
{
int i,zx;
node n1;
node1 n2;
for (i=0;i<N[x].size();i++)
{
n1=N[x][i];
if (vis[n1.y]==1)
continue;
vis[n1.y]=1;
dfs(n1.y);
vis[n1.y]=0;
fa[n1.y]=x;
}
for (i=0;i<M[x].size();i++)
{
n2=M[x][i];
if (visit[n2.y]==0)
continue;
zx=find(n2.y);
ans[n2.ans]=dis[x]-dis[zx]+dis[n2.y]-dis[zx];
}
visit[x]=1;
}
int main()
{
int i,x,y,z;
node n1;
node1 n2;
freopen("a.txt","r",stdin);
scanf("%d",&n);
for (i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
n1.y=y; n1.wei=z;
N[x].push_back(n1);
n1.y=x;
N[y].push_back(n1);
}
scanf("%d",&m);
for (i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
n2.y=y; n2.ans=i;
M[x].push_back(n2);
n2.y=x;
M[y].push_back(n2);
}
memset(vis,0,sizeof(vis));
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
for (i=0;i<n;i++)
fa[i]=i;
vis[0]=1;
dfs1(0);
dfs(0);
for (i=0;i<m;i++)
printf("%d\n",ans[i]);
return 0;
}
2,题目:http://codevs.cn/problem/1036/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
struct node
{
int y,ans;
};
const int maxSize=30000;
vector <node> M[maxSize+5];
vector <int> N[maxSize+5];
int n,m;
int ans[maxSize+5],fa[maxSize+5],vis[maxSize+5],visit[maxSize+5],dis[maxSize+5];
void dfs1(int x)
{
int i,y;
for (i=0;i<N[x].size();i++)
{
y=N[x][i];
if (vis[y]==1)
continue;
vis[y]=1;
dis[y]=dis[x]+1;
dfs1(y);
vis[y]=0;
}
}
int find(int x)
{
int r=x,temp;
while (r!=fa[r])
r=fa[r];
while (fa[x]!=r)
{
temp=fa[x];
fa[x]=r;
x=temp;
}
return r;
}
void dfs(int x)
{
int i,y,zx;
node n1;
for (i=0;i<N[x].size();i++)
{
y=N[x][i];
if (vis[y]==1)
continue;
vis[y]=1;
dfs(y);
vis[y]=0;
fa[y]=x;
}
for (i=0;i<M[x].size();i++)
{
n1=M[x][i];
if (visit[n1.y]==0)
continue;
zx=find(n1.y);
ans[n1.ans]=dis[x]-dis[zx]+dis[n1.y]-dis[zx];
}
visit[x]=1;
}
int main()
{
int i,x,y,ans1;
node n1;
freopen("a.txt","r",stdin);
scanf("%d",&n);
for (i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
N[x].push_back(y);
N[y].push_back(x);
}
scanf("%d",&m);
scanf("%d",&x);
for (i=1;i<m;i++)
{
scanf("%d",&y);
n1.y=y; n1.ans=i;
M[x].push_back(n1);
n1.y=x;
M[y].push_back(n1);
x=y;
}
memset(vis,0,sizeof(vis));
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
for (i=1;i<=n;i++)
fa[i]=i;
vis[1]=1;
dfs1(1);
dfs(1);
ans1=0;
for (i=1;i<m;i++)
ans1+=ans[i];
printf("%d\n",ans1);
return 0;
}