深度搜索之路徑選擇

 N個城市,編號1到N。城市間有R條單向道路。 
每條道路連接兩個城市,有長度和過路費兩個屬性。 
Bob只有K塊錢,他想從城市1走到城市N。問最短共需要走多長的路。如果到不了N,輸出-1。

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int K,N,R;
struct Road
{
	int d,L,t;
};
vector< vector< Road> >G(110);
int minLen=1<<30;
int minL[110][10100];
int totalLen;
int totalCost;
int visited[110];

void dfs(int s)
{
	if(s==N)
	{
		minLen=_MIN(minLen,totalLen);
		return;
	}
	for(int i=0;i<G[s].size();i++)
	{
		Road r=G[s][i];
		if(!visited[r.d])
		{
			int cost=totalCost+G[s][i].t;
			if(cost>K)
		{
			continue;
		}
		if(totalLen+G[s][i].L>=minLen||totalLen+G[s][i].L>=minL[r.d][cost])
		{
			continue;
		}
		totalLen+=G[s][i].L;
		totalCost+=G[s][i].t;
		minL[r.d][cost]=totalLen;
		visited[r.d]=1;
		dfs(r.d);
		visited[r.d]=0;
		totalLen-=G[s][i].L;
		totalCost-=G[s][i].t;
		}
	}
}

int main()
{
 
	cin>>K>>N>>R;
	for(int i=0;i<R;i++)
	{
		int s;
		Road r;
		cin>>s>>r.d>>r.L>>r.t;
		if(s!=r.d)
		{
			G[s].push_back(r);
		}
	}
	for(int m=0;m<110;m++)
	{
		for(int n=0;n<10100;n++)
		{
			minL[m][n]=1<<30;
		}
	}
	memset(visited,0,sizeof(visited));
	totalLen=0;
	minLen=1<<30;
	totalCost=0;
	visited[1]=1;
	dfs(1);
	if(minLen<(1<<30))
	{
		cout<<minLen<<endl;
	}
	else
	{
		cout<<"-1"<<endl;
	}
	
	return 0;
 } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章