poj 1062 昂贵的聘礼【条件约束----最短路】

来源:互联网 发布:刷新快捷键 mac 编辑:程序博客网 时间:2024/06/14 07:41

这个题寒假的时候就遇见了--一直不会写--


题目链接:1062


汉语题--题意就不说了---

就相当于从0点到1点的最短距离---

从0点到(1-n)点的距离都有--

1-n点之间有一些路(单向路)

有一个约束条件M

即在最短路上最大的等级与最小的等级之差小于等于M---

点就100个

我们枚举枚举一个最大等级--求出在每一个最大等级所满足的条件下的最短路--

时间复杂度O(N^3)


代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,m;int deep[120];int map[120][120];int dis[120];bool fafe[120],val[120];void init(){for (int i=0;i<=n;i++)for (int j=0;j<=n;j++)map[i][j]=1111111111;}int disk(){memset(fafe,true,sizeof(fafe));for (int i=1;i<=n;i++)if (val[i]) dis[i]=map[0][i];else dis[i]=1111111111;while (1){int mi=1111111112,ii;for (int i=1;i<=n;i++)if (fafe[i]&&mi>dis[i])mi=dis[i],ii=i;if (ii==1) return mi;fafe[ii]=false;if (val[ii])for (int i=1;i<=n;i++)if (val[i]&&fafe[i]&&dis[i]>map[ii][i]+dis[ii])dis[i]=map[ii][i]+dis[ii];}}int main(){int a,b,k;scanf("%d%d",&m,&n);init();for (int i=1;i<=n;i++){scanf("%d%d%d",&a,&deep[i],&k);map[0][i]=a;while (k--){scanf("%d%d",&a,&b);map[a][i]=b;}}int ans=1111111111;for (int i=1;i<=n;i++){int ma=deep[i];for (int j=1;j<=n;j++){if (deep[j]>ma||ma-deep[j]>m)val[j]=false;elseval[j]=true;}int ss=disk();ans=min(ss,ans);}printf("%d\n",ans);return 0;}


0 0
原创粉丝点击