给出一个有向图 , 点数n <= 100000 , 边数m <=
300000 , 求 s 到 t之间的割点?
解法:先求出s 到 t之间的最短路径 , 我们可以确定 , s 到 t之间的所有割点 , 肯定包含在这条最短路径上 , 我们再判断这条最短路径上的所有点 , 是不是割点。
判断点是不是割点时 , 我们只需要判断这个点是不是可以从其他路径到达 , 那么我们就能用bfs , 从s开始遍历 , 如果遇到了最短路径上的点 , 我们就不压入队列中 , 当队列为空 , 别且没有到达 t 时 , 这时候割点就增加了一个 , 然后再从当前点进行bfs , 直至到达终点 t。
代码:
#include
#include
#include
#include
#include
using namespace std;
#define maxn 100100
#define min(x , y) (x)<(y)?(x):(y)
struct node
{
int u;
int
next;
}grap[maxn*3];
int n , m , s , t;
int dist[maxn] , path[maxn];
int low[maxn];
int pre[maxn];
int head[maxn];
void init()
{
for(int
i=0;i<=n;i++)
{
dist[i]=low[i]=0;
head[i]=-1;
}
}
void bfs_path()
{
queueq;
q.push(s);
path[s] =
-1;
dist[s] =
1;
int i;
while(!q.empty())
{
int u =
q.front(); q.pop();
for(i =
head[u]; i != -1; i = grap[i].next)
{
int v =
grap[i].u;
if(!dist[v])
{
dist[v] =
1;
path[v] =
u;
if(v ==
t) return ;
q.push(v);
}
}
}
}
int bfs2(int u)
{
queueq;
q.push(u);
int i , res
= u;
pre[u] =
1;
while(!q.empty())
{
u =
q.front(); q.pop();
for(i =
head[u]; i != -1; i = grap[i].next)
{
int e =
grap[i].u;
if(!pre[e])
{
pre[e] =
1;
if(low[e] ==
0) q.push(e);
else
if(low[res] > low[e]) res =
e;
}
}
}
return
res;
}
int main()
{
while(scanf("%d %d" , &n , &m) !=
EOF)
{
init();
int i , x ,
y , k = 0;
for(i = 0; i
< m; i++)
{
scanf("%d
%d" , &x , &y);
grap[k].u =
y;
grap[k].next
= head[x];
head[x] =
k++;
}
scanf("%d
%d" , &s , &t);
if(n == 0 ||
n == 1)
{
cout<<n<<endl;
continue;
}
bfs_path();
if(dist[t]
== 0)
{
cout<<n<<endl;
continue;
}
i = t;
int top =
1;
while(path[i] != -1)
{
low[i] =
top++;
i =
path[i];
}
low[s] =
top;
int sum =
1;
i = s;
memset(pre, 0 , sizeof(pre));
while(i !=
t)
{
i =
bfs2(i);
sum +=
1;
}
cout<<sum<<endl;
}
return
0;
}
解法:先求出s 到 t之间的最短路径 , 我们可以确定 , s 到 t之间的所有割点 , 肯定包含在这条最短路径上 , 我们再判断这条最短路径上的所有点 , 是不是割点。
判断点是不是割点时 , 我们只需要判断这个点是不是可以从其他路径到达 , 那么我们就能用bfs , 从s开始遍历 , 如果遇到了最短路径上的点 , 我们就不压入队列中 , 当队列为空 , 别且没有到达 t 时 , 这时候割点就增加了一个 , 然后再从当前点进行bfs , 直至到达终点 t。
代码:
#include
#include
#include
#include
#include
using namespace std;
#define maxn 100100
#define min(x , y) (x)<(y)?(x):(y)
struct node
{
}grap[maxn*3];
int n , m , s , t;
int dist[maxn] , path[maxn];
int low[maxn];
int pre[maxn];
int head[maxn];
void init()
{
}
void bfs_path()
{
}
int bfs2(int u)
{
}
int main()
{
}