题意:求点1到各点的衰减度
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int N = 333,M=30010;
typedef pair<int, int> PII;
int h[N], e[M], ne[M], idx;
int low[N],clo[N];
bool p[N][N],st[N];
int d[N];
int n,m;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void f(int u)
{
low[u]=1;
vector<int> pos;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(p[clo[j]][u]){//u>j>u
if(low[j])clo[u]=clo[j];
pos.push_back(j);
}
for(int k=h[j];~k;k=ne[k]){//u>j>j1>u
int j1=e[k];
if(p[clo[j1]][u]){
if(low[j1])clo[u]=clo[j1];
pos.push_back(j);
}
}
}
for(auto i:pos){
clo[i]=clo[u];
low[i]=1;
for(int v=h[i];~v;v=ne[v]){
int k=e[v];
p[clo[u]][k]=1;
}
}
}
void dijkstra()
{
memset(d, 0x3f, sizeof d);
d[1] = 0;
priority_queue<PII, vector<PII>, greater<PII>> q;
q.push({0, 1});
while (q.size())
{
auto t = q.top();
q.pop();
int v = t.second, dis = t.first;
if (st[v]) continue;
st[v] = true;
for (int i = h[v];~i; i = ne[i])
{
int j = e[i];
if(st[j])continue;
int w=1;
if(clo[v]==clo[j])w=0;
if (d[j] > dis + w)
{
d[j] =dis + w;
q.push({d[j], j});
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
memset(h, -1, sizeof h);
cin>>n>>m;
int a,b;
for(int i=1;i<=m;i++){
cin>>a>>b;
add(a,b);
p[a][b]=true;
}
for(int i=1;i<=n;i++)clo[i]=i;
for(int i=1;i<=n;i++)f(i);
dijkstra();
for(int i=1;i<=n;i++){
if(d[i]==0x3f3f3f3f)cout<<-1<<" ";
else cout<<d[i]<<" ";
}
cout<<"\n";
return 0;
}