5 7 2
2 3
1 2
1 3
1 4
2 4
3 4
3 5
4 5
1 2 2 1 2
裸的spfa。
对于所有绿州,跑一遍spfa
用一个数组统计答案
#include
#include
#include
#include
using namespace std;
const int maxn=1000077,inf=0x3f3f3f3f;
struct E
{
int to,next,v;
}e[maxn*2];
int list[maxn],ans[maxn],d[maxn],n,m,cnt,k,a[177];
bool b[maxn];
void add(int u,int v)
{
e[++cnt].to=v; e[cnt].next=list[u]; list[u]=cnt; e[cnt].v=1;
}
void spfa(int s)
{
queue<int> q;
memset(d,0x3f,sizeof(d));
memset(b,0,sizeof(b));
d[s]=0; b[s]=1; q.push(s);
while(!q.empty())
{
int u=q.front(); q.pop();
for(int i=list[u]; i; i=e[i].next)
{
int v=e[i].to;
if(d[u]+e[i].vif(!b[v]) b[v]=1,q.push(v);
}
}
b[u]=0;
}
}
int main()
{
freopen("oasis.in","r",stdin); freopen("oasis.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=1; i<=k; i++) scanf("%d",&a[i]);
for(int i=1; i<=m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
memset(ans,0,sizeof(ans));
for(int i=1; i<=k; i++)
{
spfa(a[i]);
for(int i=1; i<=n; i++) if(d[i]!=inf) ans[i]=max(ans[i],d[i]);
}
for(int i=1; i<=n; i++) printf("%d ",ans[i]);
}