您的位置:首页 > 其它

POJ1062昂贵的聘礼

2016-11-20 19:47 211 查看
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#define max 200
#define INF 10000
using namespace std;
int price[max], vis[max], level[max];
int edge[max][max];
int dis[max];
int N, M;
void init()
{
memset(price, 0, sizeof(price));
memset(level, 0, sizeof(level));
for (int i = 0;i <= N;i++)
for (int j = 0;j <= N;j++)
edge[i][j] = INF;
}
void read()
{
int num, np, x;//num替代品编号 np替代品“优惠价格”x替代品个数
for (int i = 1;i <= N;i++)
{
cin >> price[i] >> level[i] >> x;
while(x--)
{
cin >> num >> np;
edge[num][i] = np;//替代品到当前物品的距离定义成“优惠价格”
}
edge[0][i] = price[i];//原点0到顶点i的边赋成price数组
}
}
int dijkstra()
{
memset(dis, INF, sizeof(dis));
for (int i = 1;i <= N;i++)
dis[i] = edge[0][i];
for (int i = 1;i <= N;i++)
{
int min = INF;
int k = -1;
for (int j = 1;j <= N;j++)//寻找与当前点边集相邻接且距离最小的点
{
if (dis[j] <= min && (!vis[j]))
{
k = j;
min=dis[k];
}
}
if (k == -1) break;//再也找不到可以加入集合的点 break退出循环
vis[k] = 1;//将顶点k加入点边集中
for (int i = 1;i <= N;i++)//将顶点k加入点边集之后 将与新点边集相邻接的更短的边赋值到dis数组中(dis数组更新)
if (dis[i] > dis[k] + edge[k][i]&&(!vis[i]))
dis[i] = dis[k] + edge[k][i];
}
return dis[1];
}

int main()
{
while (scanf("%d%d", &M, &N) != EOF)
{
init();
read();
int ans = INF;
for (int i = 1;i <= N;i++)
{
int min = level[i];
for (int j = 1;j <= N;j++)
{
if (level[j] - min > M || (level[j] < min))
vis[j] = 1;//标记走不通
else
vis[j] = 0;
}
int tmp = dijkstra();
if (ans > tmp)
ans = tmp;
}
printf("%d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息