poj1062 昂贵的聘礼interesting-

来源:互联网 发布:卸载kingroot的软件 编辑:程序博客网 时间:2024/05/18 18:04

PS:自己想的时候感觉很逗,感觉会有负环spfa想了两天,想好之后就在想代码实现,天额,两天都没想明白如何实现..T-T,还是去网上搜了一发

思路:

其实dijk就可以了,对于所有的点,我们求出到1这个点的单元最短路径,当然这个题重点是图的构建。

对于每个物品的货主来说,如果当前这个物品可以用其他物品换得,并且换得物品的地位的主人与他相差不超过给定值,我们就可以认为这两个点有边,且连通可达。

接下来我们在每个点构建最短路径的时候,我们假设这个点是地位最低的,依次根据来构建最短路,那么我们只可以选择地位在good[1].level-m的点上面的货主,

并且我们枚举的点不可以找过good[1].level。

接下来是dijkstra的过程:

既然我们构建了最短路,然而我们当初存图的时候只是单单判断u ,->v 是否可达,并没有判断起点到v是否可达,也就是说如果拿到的当前点index的地位是大于开始点m,那么我们虽然拿到了这个点是最短路径,也不可以进行松弛。

题真的很interesting


#include <iostream>#include <cstdio>#include <cmath>#include <cstring>using namespace std;#define inf (0x3f3f3f3f)const int maxn = 105;int m, n;struct Goods{int p, l, v;int num[maxn];int val[maxn];}goods[maxn];int map[maxn][maxn];int cost[maxn];bool vis[maxn];int dijk(int x){    int level = goods[x].l;memset(cost, inf, sizeof(cost));memset(vis, false, sizeof(vis));for (int i=0; i<=n; i++){if (goods[i].l - level <= m && goods[i].l >= level)cost[i] = map[0][i];}vis[0] = true;for (int i=0; i<n; i++){int minn = inf, index=-1;for (int j=0; j<=n; j++){if (!vis[j] && cost[j] < minn){index = j;minn = cost[j];}}if (minn == inf)break;vis[index] = true;for (int j=0; j<=n; j++){if (goods[j].l - level <= m && goods[j].l >= level)cost[j] = min(cost[j],cost[index] + map[index][j]);}}return cost[1];}int main(){while (scanf("%d %d", &m, &n) != EOF){memset(goods, 0, sizeof(goods));memset(map, inf, sizeof(map));int i, j;for (i=1; i<=n; i++){scanf("%d %d %d", &goods[i].p, &goods[i].l, &goods[i].v);for (j=0; j<goods[i].v; j++){scanf("%d %d", &goods[i].num[j], &goods[i].val[j]);}map[0][i] = goods[i].p;}for (i=1; i<=n; i++){for (j=0; j<goods[i].v; j++){if (goods[goods[i].num[j]].l - goods[i].l <= m||(goods[i].l-goods[goods[i].num[j]].l   <= m)){if (map[goods[i].num[j]][i] > goods[i].val[j]){map[goods[i].num[j]][i] = goods[i].val[j];}}}}int minn = inf;for (i=1; i<=n; i++){    if(goods[i].l<=goods[1].l&&goods[i].l-goods[1].l<=m)            {int tmp = dijk(i);if (tmp < minn)minn = tmp;            }}printf("%d\n", minn);}return 0;}


0 0
原创粉丝点击