您的位置:首页 > 其它

poj 1062 昂贵的聘礼

2010-07-17 13:29 351 查看
http://162.105.81.212/JudgeOnline/problem?id=1062

一个特别要注意的就是题目里描述的"等级制度", 可以枚举

for(j=1; j<=n; j++)
if(lev[j] >= lev[1] - m + i && lev[j] <= lev[1] + i)//枚举等级允许范围的结点
limit[j] = 1;


最小花费用的dijkstra算法求的, 在初始化dist[]数组时要注意,是否允许他们交易

for(i=1; i<=n; i++)
{
if(limit[i])
dist[i] = map[1][i];
else
dist[i] = INF;
visted[i] = 0;
}


dijkstra算法都好久没写了, 照着书本写的- -

#include<iostream>
using namespace std;
#define INF 0x7ffffff
#define MAX 101
int map[MAX][MAX], value[MAX], lev[MAX], dist[MAX];
int m, n;
bool limit[MAX], visted[MAX];
//dijkstra求最短路径, dist[i]表示始点(1)到i点的花费
int dijkstra()
{
int i, j, k, mindist;
for(i=1; i<=n; i++) { if(limit[i]) dist[i] = map[1][i]; else dist[i] = INF; visted[i] = 0; }
dist[1] = 0;
for(i=1; i<=n; i++)
{
mindist = INF;
//选取最小的dist值
for(j=1; j<=n; j++)
{
if(!visted[j] && limit[j] && dist[j] < mindist)
{
k = j;
mindist = dist[j];
}
}
visted[k] = 1;
//更新所有未访问节点的dist值
for(j=1; j<=n; j++)
{
if(!visted[j] && limit[j])
if(map[k][j] < INF && dist[k] + map[k][j] < dist[j])
dist[j] = dist[k] + map[k][j];
}
}
mindist = INF;
for(i=1; i<=n; i++)
{
dist[i] += value[i];
if(dist[i] < mindist)
mindist = dist[i];
}
return mindist;
}
int main()
{
int i, j, t, tmp, min;
while(scanf("%d%d", &m, &n) != EOF)
{
//构图
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
map[i][j] = i==j?0:INF;
for(i=1; i<=n; i++)
{
scanf("%d%d%d", &value[i], &lev[i], &t);
for(j=1; j<=t; j++)
{
scanf("%d", &tmp);
scanf("%d", &map[i][tmp]);
}
}
min = value[1];
for(i=0; i<=m; i++)
{
memset(limit, 0, sizeof(limit));
for(j=1; j<=n; j++) if(lev[j] >= lev[1] - m + i && lev[j] <= lev[1] + i)//枚举等级允许范围的结点 limit[j] = 1;
tmp = dijkstra();
if(min > tmp)
min = tmp;
}
printf("%d/n", min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: