1. 程式人生 > 實用技巧 >最短路之清理牛棚

最短路之清理牛棚

題目

傳送們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;

}