题目
分析
- 差分约束
- sum[r]-sum[l-1]=1
- sum[i]-sum[i-1]<=1
- 所以l-1 r 1 r l-1 -1 i-1 i 1 i-1 i 0
代码
1 #include<iostream>
2 #include<queue>
3 #include<cstdio>
4 using namespace std;
5 const int inf=100000000;
6 struct sb
7 {
8 int to,nx,w;
9 }g[1000001*4];
10 int cnt,list[1000001*4];
11 void add(int x,int y,int w)
12 {
13 g[++cnt].to=y; g[cnt].nx=list[x]; g[cnt].w=w; list[x]=cnt;
14 }
15 int dis[1000001],vis[1000001];
16 int n,m;
17 int tot;
18 int spfa()
19 {
20 for(int i=0;i<=n;i++) dis[i]=inf;
21 deque<int> q;
22 dis[0]=0; q.push_back(0); vis[0]=1;
23 while (!q.empty())
24 {
25 int x=q.front(); q.pop_front(); vis[x]=0;
26 for (int i=list[x];i;i=g[i].nx)
27 {
28 int y=g[i].to;
29 if (dis[x]+g[i].w<dis[y])
30 {
31 dis[y]=dis[x]+g[i].w;
32 if (!vis[y])
33 {
34 if (++tot>1926817) return -1;
35 vis[y]=1;
36 if (q.size()&&dis[g[i].to]>dis[q.front()]) q.push_back(g[i].to); else q.push_front(g[i].to);
37 }
38 }
39 }
40
41 }
42 return dis[n];
43 }
44 int main ()
45 {
46 scanf("%d%d",&n,&m);
47 for (int i=1,l,r;i<=m;i++)
48 {
49 scanf("%d%d",&l,&r);
50 add(l-1,r,1); add(r,l-1,-1);
51 }
52 for (int i=1;i<=n;i++)
53 add(i-1,i,1),add(i,i-1,0);
54 long long a=spfa();
55 if (a==inf||a==-1) cout<<-1;
56 else cout<<a;
57 }