JZOJ 3233. 照片
题目
分析
- 差分约束
- 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 }
为何要逼自己长大,去闯不该闯的荒唐
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步