您的位置:首页 > 其它

【bfs优先队列】POJ 3635

2012-03-06 12:15 274 查看
http://poj.org/problem?id=3635

#define N 1005
struct node{
int u;
int len;
};
vector<node> v
;
int n,m;
int price
;
void add(int a,int b,int w){
node tmp;
tmp.u = b;
tmp.len = w;
v[a].push_back(tmp);
tmp.u = a;
v[b].push_back(tmp);
}
struct Node{
int id;//点编号
int res;//剩余油量
int val;//最小花费
friend bool operator < (Node a,Node b){
return a.val>b.val;
}
};
int dp[1001][101];//dp[i][j]表示到达i点后还剩j油量
bool vis[1001][101];//记录状态是否访问过
int bfs(int c,int s,int t){
priority_queue<Node> pp;
int i,j,k;
dp[s][0] = 0;
Node cur,next;
cur.id = s;
cur.res = 0;
cur.val = 0;
vis[s][0] = 1;
pp.push(cur);
while(!pp.empty()){
cur = pp.top();
pp.pop();
int u = cur.id;
int res = cur.res;
int val = cur.val;
vis[u][res] = 1;
if(u == t){
return val;
}
///每个点有两个选择,要么自己加油,要么走到下一点
if(res+1 <= c && !vis[u][res+1] && dp[u][res+1]>dp[u][res] + price[u]){
next.id = u;
next.res = res+1;
next.val = dp[u][res] + price[u];
dp[u][res+1] = dp[u][res]+price[u];
pp.push(next);
}
for(i=0;i<v[u].size();i++){
int vv = v[u][i].u;
k = res-v[u][i].len;
if(k<=c && k>=0 && !vis[vv][k] && val<dp[vv][k]){
dp[vv][k] = val;
next.id = vv;
next.res = k;
next.val = val;
pp.push(next);
}
}
}
return -1;
}

int main(){
while(scanf("%d%d",&n,&m) != -1){
int i,j,k;
for(i=0;i<n;i++){
v[i].clear();
scanf("%d",&price[i]);
}
while(m--){
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
add(a,b,w);
}
scanf("%d",&m);
while(m--){
int c,s,t;
scanf("%d%d%d",&c,&s,&t);
for(i=0;i<=n;i++){
for(j=0;j<=c;j++){
dp[i][j] = MAX;
vis[i][j] = 0;
}
}
int ans = bfs(c,s,t);
if(ans==-1)puts("impossible");
else printf("%d\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: