您的位置:首页 > 其它

pat-A 1003 回溯+剪枝

2015-09-26 15:59 771 查看
这道题逻辑上是很清楚,就怕有人把回溯写成深搜了。。。。

别忘了剪枝 要不最后一个点过不了。

#include<iostream>

#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
#include<set>
#include<stack>
#include<cmath>
#include<cstring>
#include<string>
#include <iostream>
#include <cstdio>
#include<climits>
using namespace std;
int mp[510][510];
int visited[510];
int minst=100000000;
int maxeg = 0;
int cnt = 0;
vector<int> edge;
int n;
void solver(int cur,int end,int st,int cou){
if (cur == end)
{
if (st < minst)
{
cnt = 1;
minst = st;
maxeg = cou;
return;
}
else if(st==minst){
++cnt;
if (cou > maxeg)
maxeg = cou;
return;
}
}
if (st > minst)
{
return;
}
int i;
for ( i = 0; i < n; i++){
if (mp[cur][i] != 0 && !visited[cur]){
visited[cur] = 1;
solver(i, end, st + mp[cur][i], cou + edge[i]);
visited[cur] = 0;
}
}
}
int main(){
int  m, c1, c2;
cin >> n >> m >> c1 >> c2;

for (int i = 0; i < n; i++){
edge.push_back(0);
cin >> edge[i];
}
for (int i = 0; i < m; i++){
int a, b,d;
cin >> a >> b>>d;
mp[a][b] = d;
mp[b][a] = d;

}
solver(c1,c2,0,edge[c1]);
cout << cnt <<" "<< maxeg<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: