标签:
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