pku 1062 昂贵的婚礼

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. #define MAX 101
  5. #define INF 999999999
  6. int matrix[MAX][MAX];
  7. int VertexValue[MAX];
  8. int VertexRank[MAX];
  9. int s[MAX];
  10. int main()
  11. {
  12.     int i,j;
  13.     int adj; //邻接点
  14.     int X;  //X: 替代品数
  15.     //input
  16.     int M,N;
  17.     scanf("%d%d",&M,&N);
  18.     for(i=1;i<=N;i++)
  19.         for(j=1;j<=N;j++)
  20.             if(i!=j)
  21.                 matrix[i][j]=INF;
  22.     for(i=1;i<=N;i++)
  23.     {
  24.         scanf("%d%d%d",&VertexValue[i],&VertexRank[i],&X);
  25.         for(j=1;j<=X;j++)
  26.         {
  27.             scanf("%d",&adj);
  28.             scanf("%d",&matrix[i][adj]);
  29.         }
  30.     }
  31.     
  32.     //Dijkstra
  33.     int dis[MAX];
  34.     int path[MAX];
  35.     int mindis=INF;
  36.     int minRank[MAX];
  37.     int maxRank[MAX];
  38.     int u;
  39.     for(i=1;i<=N;i++)
  40.     {
  41.         if(abs(VertexRank[i]-VertexRank[1])<=M)/*...*/
  42.             dis[i]=matrix[1][i];
  43.         else
  44.             dis[i]=INF;
  45.         minRank[i]=maxRank[i]=VertexRank[i];
  46.         path[i]=1;
  47.     }
  48.     s[1]=1;
  49.     for(i=1;i<=N;i++)
  50.     {
  51.         int flag=0;
  52.         mindis=INF;
  53.         for(j=1;j<=N;j++)
  54.             if(!s[j] && abs(VertexRank[j]-maxRank[path[j]])<=M /*...*/
  55.                 && abs(VertexRank[j]-minRank[path[j]])<=M && dis[j]<mindis)
  56.             {
  57.                 mindis=dis[j];
  58.                 u=j;
  59.                 flag=1;
  60.             }
  61.         if(!flag)
  62.             break;
  63.         if(VertexRank[u]<maxRank[path[u]])
  64.             maxRank[u]=maxRank[path[u]];
  65.         if(VertexRank[u]>minRank[path[u]])
  66.             minRank[u]=minRank[path[u]];
  67.         s[u]=1;
  68.         for(j=1;j<=N;j++)
  69.             if(!s[j] && matrix[u][j]<INF &
  70.                 abs(VertexRank[j]-maxRank[u])<=M/*...*/
  71.                 && abs(VertexRank[j]-minRank[u])<=M
  72.                 && matrix[u][j]+dis[u]<dis[j])
  73.             {
  74.                 dis[j]=matrix[u][j]+dis[u];
  75.                 path[j]=u;
  76.             }
  77.     }
  78.     //output
  79.     int MinCost=INF;
  80.     for(i=1;i<=N;i++)
  81.     {
  82.         if((VertexValue[i]+dis[i])<MinCost)
  83.             MinCost=VertexValue[i]+dis[i];
  84.     }
  85.     printf("%d/n",MinCost);
  86.     return 0;
  87. }
  88. //87 4553266(2) xiaofengsheng 220K 0MS C++ 1590B 2009-01-14 11:30:38 
  89. // 无数次WA后,终于AC. rank让我心酸让我痛. (?_?)
  90. //rank 较为难处理,主要是用 maxRank[MAX] minRank[MAX] 两个数组来
  91. //记录已经访问过的最短路径上的最大rank 和 最小rank,以判断这个点和这
  92. //条路径上的所有其他点是否越界(abs(..)>M)
  93. //感谢suikay的帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值