- #include <iostream>
- #include <cmath>
- using namespace std;
- #define MAX 101
- #define INF 999999999
- int matrix[MAX][MAX];
- int VertexValue[MAX];
- int VertexRank[MAX];
- int s[MAX];
- int main()
- {
- int i,j;
- int adj; //邻接点
- int X; //X: 替代品数
- //input
- int M,N;
- scanf("%d%d",&M,&N);
- for(i=1;i<=N;i++)
- for(j=1;j<=N;j++)
- if(i!=j)
- matrix[i][j]=INF;
- for(i=1;i<=N;i++)
- {
- scanf("%d%d%d",&VertexValue[i],&VertexRank[i],&X);
- for(j=1;j<=X;j++)
- {
- scanf("%d",&adj);
- scanf("%d",&matrix[i][adj]);
- }
- }
- //Dijkstra
- int dis[MAX];
- int path[MAX];
- int mindis=INF;
- int minRank[MAX];
- int maxRank[MAX];
- int u;
- for(i=1;i<=N;i++)
- {
- if(abs(VertexRank[i]-VertexRank[1])<=M)/*...*/
- dis[i]=matrix[1][i];
- else
- dis[i]=INF;
- minRank[i]=maxRank[i]=VertexRank[i];
- path[i]=1;
- }
- s[1]=1;
- for(i=1;i<=N;i++)
- {
- int flag=0;
- mindis=INF;
- for(j=1;j<=N;j++)
- if(!s[j] && abs(VertexRank[j]-maxRank[path[j]])<=M /*...*/
- && abs(VertexRank[j]-minRank[path[j]])<=M && dis[j]<mindis)
- {
- mindis=dis[j];
- u=j;
- flag=1;
- }
- if(!flag)
- break;
- if(VertexRank[u]<maxRank[path[u]])
- maxRank[u]=maxRank[path[u]];
- if(VertexRank[u]>minRank[path[u]])
- minRank[u]=minRank[path[u]];
- s[u]=1;
- for(j=1;j<=N;j++)
- if(!s[j] && matrix[u][j]<INF &
- abs(VertexRank[j]-maxRank[u])<=M/*...*/
- && abs(VertexRank[j]-minRank[u])<=M
- && matrix[u][j]+dis[u]<dis[j])
- {
- dis[j]=matrix[u][j]+dis[u];
- path[j]=u;
- }
- }
- //output
- int MinCost=INF;
- for(i=1;i<=N;i++)
- {
- if((VertexValue[i]+dis[i])<MinCost)
- MinCost=VertexValue[i]+dis[i];
- }
- printf("%d/n",MinCost);
- return 0;
- }
- //87 4553266(2) xiaofengsheng 220K 0MS C++ 1590B 2009-01-14 11:30:38
- // 无数次WA后,终于AC. rank让我心酸让我痛. (?_?)
- //rank 较为难处理,主要是用 maxRank[MAX] minRank[MAX] 两个数组来
- //记录已经访问过的最短路径上的最大rank 和 最小rank,以判断这个点和这
- //条路径上的所有其他点是否越界(abs(..)>M)
- //感谢suikay的帮助!
pku 1062 昂贵的婚礼
最新推荐文章于 2017-03-04 15:10:09 发布