自從區域賽以後就沒參加浙大月賽這種比賽了
這題比賽的時候也沒有過
有兩種解法,這種是並查集
想象一下從s到t的一條簡單路,想想簡單路上每個點的性質:比如簡單路上的點i,不管刪去圖上任何一個點,點i總會至少與s或t在一個相連的集合中
另外想想不在簡單路上的點j,一定可以找到一個點,使得j與s和t都不在一個相連的集合中
用這種性質即可證明
#include <cstdio>
#include <cstring>
const int MAXN = 100 + 3;
int n, m, s, t;
int map[MAXN][MAXN];
int p[MAXN];
bool flag[MAXN];
void init()
{
for(int i = 0; i < n; i++) p[i] = i;
}
int find(int x)
{
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}
void Union(int a, int b)
{
a = find(a);
b = find(b);
p[a] = b;
}
int main()
{
while(scanf("%d%d%d%d", &n, &m, &s, &t) != EOF)
{
memset(map, 0, sizeof(map));
memset(flag, 0, sizeof(flag));
int a, b;
for(int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
map[a][b] = map[b][a] = 1;
}
for(int i = 0; i < n; i++)//一定需要s和t
{
init();
for(int j = 0; j < n; j++)
for(int k = j + 1; k < n; k++)
if(j != i && k != i && map[j][k])
{
Union(j, k);
}
for(int j = 0; j < n; j++)
if(j != i && find(j) != find(s) && find(j) != find(t))
flag[j] = 1;
}
int ans = 0;
for(int i = 0; i < n; i++)
if(flag[i]) ans++;
printf("%d\n", ans);
}
return 0;
}