题意:给n m t 代表n个点m条边t是时间限制。s,e分别代表起点和终点。
给出m行,每一行包含a b c代表a和b有一条边,通过这条边的时间为c
然后再给n个数,分别代表每个点有的珠宝数。
求:在t时间内从s开始到e最多可以拿的珠宝数。
我的做法:
n不过才10而已,想什么姿势都可以什么姿势。暴力建图+dfs
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <set> #include <vector> #include <map> #include <queue> #include <set> #include <algorithm> using namespace std; vector <int> e[20]; int vv[20]; int ha[20]; int dis[20][20]; int n,m,t,st,et; int mm; void dfs(int u,int val,int step){ if(step>t)return ; if(u==et){ if(mm<val)mm=val; } for(int i=0;i<(int)e[u].size();i++){ int v=e[u][i]; if(ha[v])continue; ha[v]=1; dfs(v,val+vv[v],step+dis[u][v]); ha[v]=0; } } int main() { while(~scanf("%d%d%d",&n,&m,&t)){ for(int i=0;i<20;i++)e[i].clear(); scanf("%d%d",&st,&et); memset(dis,-1,sizeof(dis)); for(int i=0;i<n;i++) scanf("%d",&vv[i]); for(int i=0,x,y,tt;i<m;i++){ scanf("%d%d%d",&x,&y,&tt); if(dis[x][y]==-1||dis[x][y]>tt) dis[x][y]=dis[y][x]=tt; } for(int k=0;k<n;k++){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(dis[i][k]==-1||dis[k][j]==-1)continue; if(dis[i][j]==-1) dis[i][j]=dis[i][k]+dis[k][j]; else dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } } for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(dis[i][j]!=-1){ e[i].push_back(j); e[j].push_back(i); } memset(ha,0,sizeof(ha)); ha[st]=1; mm=0; dfs(st,vv[st],0); printf("%d\n",mm); } return 0; }
|