标签:
Description
Input
Output
Sample Input
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
Sample Output
5250
题解:用深搜解决的。搜索过程找最小值。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <vector> using namespace std; const int INF = 0x3fffffff; int rank[1003]; bool visited[1003]; //感觉用不到,因为感觉题意是从前面指向后面,但是不要会爆内存。 int value[103][103]; int val[1003]; vector<int> vec[103]; int ans; void dfs(int x,int max,int min,int n,int t) { visited[x] = true; for(int i = 0;i < vec[x].size();i++) { int y = vec[x][i]; if(abs(max - rank[y]) > n || abs(min - rank[y]) > n) { continue; } if(visited[vec[x][i]]) { continue; } int t1 = max; int t2 = min; if(t1 < rank[vec[x][i]]) { t1 = rank[vec[x][i]]; } if(t2 > rank[vec[x][i]]) { t2 = rank[vec[x][i]]; } if(ans > t + val[vec[x][i]] + value[x][vec[x][i]]) { ans = t + val[vec[x][i]] + value[x][vec[x][i]]; } dfs(vec[x][i],t1,t2,n,t + value[x][vec[x][i]]); } visited[x] = false; } int main() { int n,m; while(scanf("%d%d",&n,&m) != EOF) { int p,l,x; bool flag = true; memset(value,0,sizeof(value)); memset(visited,false,sizeof(visited)); for(int i = 1;i <= m;i++) { scanf("%d%d%d",&p,&l,&x); rank[i] = l; val[i] = p; int t,v; for(int j = 0;j < x;j++) { scanf("%d%d",&t,&v); value[i][t] = v; } } for(int i = 1;i <= m;i++) { for(int j = 1;j <= m;j++) { if(value[i][j] != 0 && abs(rank[1] - rank[j]) <= n) { vec[i].push_back(j); } } } ans = val[1]; dfs(1,rank[1],rank[1],n,0); printf("%d\n",ans); for(int i = 1;i <= m;i++) { vec[i].clear(); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wang2534499/article/details/47701363