貪心構造距離,Dijkstra構造邊。
有一些細節寫錯了,在遍歷邊的時候,把e.v寫成了i,WA了一段時間。
一開始寫代碼的時候就要小心。
代碼
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
int n,m;
int vis[maxn];
int d[maxn];
bool done[maxn];
int l[maxn];
int r[maxn];
struct Edge
{
int u,v,d;
};
vector<Edge>edges;
vector<int>G[maxn];
void read()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
G[i].clear();
vis[i]=0;
l[i]=0;
r[i]=inf;
}
edges.clear();
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d %d",&u,&v);
edges.push_back((Edge){u,v,-1});
G[u].push_back(edges.size()-1);
}
}
void handle(int u)
{
for(int i=0;i<(int)G[u].size();i++)
{
Edge& e = edges[G[u][i]];
vis[e.v]=1;
l[e.v]=max(l[e.v],d[u]+1);
r[e.v]=min(r[e.v],d[u]+n);
}
}
struct HeapNode
{
int d,u;
bool operator < (const HeapNode& rhs) const
{
return d>rhs.d;
}
};
void dij()
{
for(int i=1;i<=n;i++)
done[i]=false;
priority_queue<HeapNode>Q;
Q.push((HeapNode){d[1],1});
while(!Q.empty())
{
HeapNode now = Q.top();
Q.pop();
int u = now.u;
if(done[u]) continue;
done[u]=true;
for(int i=0;i<(int)G[u].size();i++)
{
Edge& e = edges[G[u][i]];
int D = d[e.v]-d[e.u];
if(1<=D&&D<=n)
{
e.d=D;
Q.push((HeapNode){d[e.v],e.v});
}
else e.d=n;
}
}
}
void solve()
{
read();
vis[1]=1;
d[1]=0;
handle(1);
int m1=0;
int m2=0;
int k1=2;
int k2=n;
while(k1<=k2)
{
while(k1<=k2&&vis[k1])
{
d[k1]=max(l[k1],m1+1);
m1=d[k1];
handle(k1++);
}
if(k1<=k2&&vis[k2])
{
d[k2]=max(l[k2],m2+1);
m2=d[k2];
handle(k2--);
}
}
dij();
for(int i=0;i<m;i++)
printf("%d\n",edges[i].d);
}
int main()
{
int T;
scanf("%d",&T);
while(T--) solve();
return 0;
}