poj 1062 最短路
/* 题意:很好理解,不多说了 题解:求最短路,迪杰斯特拉算法,并且要枚举 注意:有等级的限制,因此在初始化vis[]的时候根据等级先把不能交易的 人先处理:vis[I] = 1; */ #include <cstdio> #include <cstring> int map[105][105]; int cost[105],dist[105],rank[105],vis[105]; int max,n; int dijkstra()//迪杰斯特拉算法求最短路 { int i,j; int node,sd; for(i=1; i<=n; i++)//特殊的处理,将不交换,直接买的物品的价格初始化 dist[i] = cost[i]; for(i=1; i<=n; i++) { node = 0; sd = 2147483647; for(j=1; j<=n; j++) { if (!vis[j] && sd>dist[j])//找出未访问的点中路径最短的点并赋给node { sd = dist[j]; node = j; } } if (node == 0)//当点已经遍历完,break; break; vis[node] = 1; for(j=1; j<=n; j++) if (!vis[j] && map[node][j]>0 && dist[j]>dist[node]+map[node][j]) //以node为基点对其它未访问的点进行松弛 dist[j] = dist[node]+map[node][j]; } return dist[1]; } int main(void) { int m,i,j,t,p,price,minprice; scanf("%d%d",&m,&n); memset(map,0,sizeof(map)); for(i=1; i<=n; i++) { scanf("%d%d%d",&cost[i],&rank[i],&t); while (t--) { scanf("%d%d",&p,&price); map[p][i] = price; } } minprice = 2147483647; for(i=1; i<=n; i++) { max = rank[i]; for(j=1; j<=n; j++)//枚举不符合的点 { if (rank[j]>max || max-rank[j]>m) vis[j] = 1; else vis[j] = 0; } t = dijkstra(); if (minprice > t) minprice = t; } printf("%d\n",minprice); return 0; }