思路就是先确定范围转换为表达式,再用查分约束跑一遍spfa。
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=4e3+1;
int End[N],Last[N],Next[N],Len[N],e;
int x[N],y[N];
void addedge(int x,int y,int z)
{
End[++e]=y;
Next[e]=Last[x];
Last[x]=e;
Len[e]=z;
}
int dis[N],cnt[N];
bool vis[N];
queue < int > q;
bool spfa(int s)
{
for(int i=1;i<=n;i++) dis[i]=1e9;
dis[s]=0;
for(int i=1;i<=n;i++)
{
q.push(i);
vis[i]=true;
cnt[i]++;
}
while(q.size())
{
int x=q.front();
q.pop();
vis[x]=false;
for(int i=Last[x];i;i=Next[i])
{
int y=End[i];
if(dis[y]>dis[x]+Len[i])
{
dis[y]=dis[x]+Len[i];
if(!vis[y])
{
q.push(y);
vis[y]=true;
cnt[y]++;
if(cnt[y]>n+1)
return false;
}
}
}
}
return true;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x[i]>>y[i];
addedge(y[i],x[i],-1);
addedge(x[i],y[i],9);
}
if(spfa(1))
{
cout<<n<<' '<<m<<'\n';
for(int i=1;i<=n;i++)
cout<<x[i]<<' '<<y[i]<<' '<<dis[i]<<'\n';
}
else puts("-1");
return 0;
}
对不起,给大家添麻烦了