给一个图,从点1出发,d表示从1出发的最短路,求一种边的权值构造方法使 d(1)
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <queue>
#include <map>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <set>
#include <cmath>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
int d[MAXN];
struct AP
{
int to,id;
};
vector<AP> G[MAXN];
int n,m;
bool ans[MAXN];
bool vis[MAXN];
int l[MAXN],r[MAXN];
void dfs(int u,int time)
{
d[u]=time;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i].to;
if(vis[v]) continue;
vis[v]=true;
ans[G[u][i].id]=true;
}
}
int abbs(int v)
{
if(v<0) return -v;
return v;
}
int main()
{
//freopen("in","r",stdin);
int t;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) G[i].clear();
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
l[i]=u,r[i]=v;
G[u].push_back((AP){v,i});
}
memset(ans,0,sizeof(ans));
memset(vis,0,sizeof(vis));
int s=1,t=n;
int x=1;
vis[1]=true;
d[1]=0;
for(int i=0;s<=t;i++)
{
if(i%2)
{
if(vis[t]) dfs(t--,x++);
}
else
{
if(vis[s]) dfs(s++,x++);
}
}
for(int i=0;i<m;i++)
{
if(ans[i])
{
printf("%d\n",abbs(d[l[i]]-d[r[i]]));
}
else
printf("%d\n",n);
}
}
return 0;
}