您的位置:首页 > 其它

昂贵的聘礼 POJ - 1062

2018-03-05 19:09 351 查看
中文题面
思路:卡在了等级限制
一开始只计算mindegreee及仅计算了最低等级。看了别人的题解才知道正确做法。
错误原因:列如 

第一个搜索的点的地位为 5
地位限制为2
假设其访问到了地位为3的人,但应为仅限制了mindegree即——若需与地位为6人交易才能寻找到最短路,显然不满足题意
思路:

 同时限制mindegree maxdegree
注意mindegree 初始值应为maxdegree-dlimit(满足地位限制) 最大值未酋长地位(最酋长的地位)
maxdegree初始值为酋长的地位

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#include <cstdio>
#define MAX_V 105
#define INF 1<<30
using namespace std;
struct edge{
int v;
int cost;
};
vector<edge> G[MAX_V];
int V;
bool inqueue[MAX_V];
int d[MAX_V];
int dlimit,degrees[MAX_V];
int mindegree,maxdegree;
void spfa(int s){
for (int i = 0;i<=V;i++)
d[i] = INF;
memset(inqueue,0,sizeof inqueue);
d[s] = 0; inqueue[s] = true;
queue<int> Q;
Q.push(s);
while (!Q.empty()){
int u = Q.front(); Q.pop();
inqueue[u] = false;
for (int i = 0;i<G[u].size();i++){
int v = G[u][i].v;
if (degrees[v] < mindegree || degrees[v] > maxdegree) continue;
if (d[u] + G[u][i].cost < d[v]){
d[v] = d[u] + G[u][i].cost;
if (!inqueue[v]){
Q.push(v);
}
}
}
}
}
void init (){
scanf("%d%d",&dlimit,&V);
for (int i = 0;i<=V;i++){
G[i].clear();
}
for (int i = 1;i<=V;i++){
int cost,X;
scanf("%d%d%d",&cost,°rees[i],&X);
G[0].push_back(edge{i,cost});
for (int j = 0;j<X;j++){
int from,w;
scanf("%d%d",&from,&w);
G[from].push_back(edge{i,w});
}
}

}
void solve(){
int mincost = INF;
for (mindegree = degrees[1]-dlimit,maxdegree = degrees[1];mindegree<=degrees[1];mindegree++,maxdegree++){
spfa(0);
mincost = min(mincost,d[1]);
}
printf("%d\n",mincost);
}
int main()
{
init();
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 最短路