这题要求最大值,为什么可以跑最短路?
还有我的最长路为什么就过一个点啊?
#include<bits/stdc++.h>
using namespace std;
#define inf 1e9
const int maxn=2e6+10;
const int mod=1e9+7;
int n,m;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
/*
dis[i]>=dis[i-1]
dis[i]<=dis[i-1]+1
dis[b_i]<=dis[a_i-1]+1
dis[b_i]>=dis[a_i-1]+1
*/
int beg[maxn],nex[maxn],to[maxn],w[maxn],e;
inline void add(int x,int y,int z){
e++;nex[e]=beg[x];
beg[x]=e;to[e]=y;w[e]=z;
}
int dis[maxn],cnt[maxn],vis[maxn];
queue<int>q;
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++)
add(i-1,i,0),add(i,i-1,-1);
int x,y;
for(int i=1;i<=m;i++){
x=read()-1,y=read();
add(y,x,-1),add(x,y,1);
}
for(int i=1;i<=n;i++)
dis[i]=-inf;
q.push(0);vis[0]=1;
while(!q.empty()){
x=q.front();
q.pop();vis[x]=0;
for(int i=beg[x];i;i=nex[i]){
y=to[i];
if(dis[y]<dis[x]+w[i]){
dis[y]=dis[x]+w[i];
if(!vis[y]){
vis[y]=1;
q.push(y);
}
}
}
}
printf("%d\n",dis[n]);
return 0;
}