最短路之清理牛棚
阿新 • • 發佈:2020-06-29
題目
傳送們P4644 [USACO05DEC]Cleaning Shifts S
思路
這道題的思路很清奇,很難想到,我們把時間的起點和終點存為求最短路的起點和終點,把每個奶牛的起始點和終止點存為節點,將奶牛需要的工資作為距離,並且從終點列舉一遍到起點,兩兩整時間相連,且距離為0,就可以直接跑spfa了,是不是很神奇,這也是把這道題歸為圖論最短路的原因
下面是程式碼
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; struct edge{ int dis,to,next; }e[maxn]; int n,m,E; int head[maxn],cnt; int add(int from,int to,int dis){ e[++cnt].next=head[from]; e[cnt].to=to; e[cnt].dis=dis; head[from]=cnt; } int vis[maxn],dis[maxn]; queue<int>q; void spfa(){ for(int i=m;i<=E;i++){ dis[i]=0x7f7f7f7f; vis[i]=0; } q.push(m); vis[m]=1; dis[m]=0; while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(dis[v]>dis[u]+e[i].dis){ dis[v]=dis[u]+e[i].dis; if(vis[v]==0){ q.push(v); vis[v]=1; } } } } } inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } int main(){ n=read();m=read();E=read(); E++; for(int i=1;i<=n;i++){ int x,y,z; x=read(),y=read(),z=read(); add(x,y+1,z); } for(int i=m;i<=E-1;i++){ add(i,i-1,0); } spfa(); if(dis[E]==0x7f7f7f7f){ printf("-1"); return 0; } else printf("%d",dis[E]); return 0; }