思路:简单的DFS。
记录:https://www.luogu.com.cn/record/192535695
代码:
#include <bits/stdc++.h>
using namespace std;
namespace my_namespace//我把整个程序装进自己的命名空间里了
{
int n,m,start,target;
int v[100005];//价值
int ans=(99999999);//先把ans设成一个极值
struct businessman//商人结构体
{
int x,y,cost;
//根据题意,三个变量分别代表x[j]、y[j]和在这个商人处交易的花费。
}sr[200005];
vector<int> G[100005];//邻接表:这个商品能在哪些商人处进行交易
bool vis[100005];//
void dfs(int sp,int nowcost)//sp:当前商品 nowcost:当前的花费
{
if(nowcost>ans) return;//最优性剪枝
if(sp==target)//找到解
{
ans=min(ans,nowcost);//打擂法更新
return;
}
//转移
for(int i:G[sp])
{
if(!vis[sr[i].y])
{
vis[sr[i].y]=1;
dfs(sr[i].y,nowcost+sr[i].cost);
vis[sr[i].y]=0;
}
}
}
int main()
{
cin>>n>>m>>start>>target;
for(int i=0;i<n;i++)
{
cin>>v[i];
}
for(int i=0;i<m;i++)
{
cin>>sr[i].x>>sr[i].y;
//根据题意,计算该商人处交易的花费
if(v[sr[i].x]>v[sr[i].y])
{
sr[i].cost=0-(v[sr[i].x]-v[sr[i].y]);
}
else
{
sr[i].cost=v[sr[i].x]-v[sr[i].y];
}
sr[i].cost++;//根据题意,商人需要收取1元手续费
G[sr[i].x].push_back(i);
}
vis[start]=1;
dfs(start,0);
//如果有解输出解,否则输出No solution
if(ans!=99999999) cout<<ans;
else cout<<"No solution";
return 0;
}
};
int main()
{
int ret=my_namespace::main();
return ret;
}
请重点检查下我的实现细节。能说说错在哪里了吗?谢谢!