poj 1062 昂贵的聘礼 最短路
2014-08-15 19:23
387 查看
中文题 题意就不说了,注意题目里说的是所有的人等级差不能超过一个值,而不是两个两个之间不能超过(这里题意搞错了wa半天),
建好图,枚举可以在这个最短路里的最高级和最低级再跑最短路 得到最小值就可以了。
建好图,枚举可以在这个最短路里的最高级和最低级再跑最短路 得到最小值就可以了。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define INF 99999999 struct node{int price,rank1;}p[1002]; int g[102][102],d[102]; bool vis[102]; int dij(int s,int n,int min1,int max1) { int minn,mini; for(int i=1;i<=n;i++) d[i]=INF; memset(vis,false,sizeof(vis)); d[s]=0; for(int k=1;k<n;k++) { minn=INF; for(int i=1;i<=n;i++) if(!vis[i]&&d[i]<minn) { minn=d[i]; mini=i; } vis[mini]=true; for(int i=1;i<=n;i++) if(p[i].rank1>=min1&&p[i].rank1<=max1&&d[mini]+g[mini][i]<d[i]) d[i]=d[mini]+g[mini][i]; } minn=INF; for(int i=1;i<=n;i++) { d[i]+=p[i].price; if(minn>d[i]) minn=d[i]; } return minn; } int main() { int n,k,c,a,b; while(~scanf("%d%d",&c,&n)) { for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) g[i][j]=INF; for(int i=1;i<=n;i++) { scanf("%d%d%d",&p[i].price,&p[i].rank1,&k); while(k--) { scanf("%d%d",&a,&b); g[i][a]=min(b,g[i][a]); } } int temp,ans=INF; temp=p[1].rank1; temp=max(p[1].rank1-c,0); for(int i=temp;i<=p[1].rank1;i++) { int pp; pp=dij(1,n,i,i+c); if(pp<ans) ans=pp; } printf("%d\n",ans); } }
相关文章推荐
- poj 1062 昂贵的聘礼 最短路bellman
- [poj1062]昂贵的聘礼_最短路_离散化
- poj 1062 昂贵的聘礼(最短路)
- POJ1062 昂贵的聘礼(Dijkstra最短路)
- poj 1062(最短路——昂贵的聘礼)
- POJ 1062 昂贵的聘礼 最短路 难度:0
- POJ 1062 昂贵的聘礼(最短路+枚举)
- POJ 1062-昂贵的聘礼(最短路_dijkstra)
- poj 1062 昂贵的聘礼(最短路 dijk+枚举)
- POJ 1062 昂贵的聘礼 最短路
- poj 1062 昂贵的聘礼(最短路)
- POJ1062 昂贵的聘礼(最短路)
- POJ 1062 - 昂贵的聘礼(最短路`dijkstra)
- POJ 1062 昂贵的聘礼 【枚举 + 最短路】
- POJ1062 昂贵的聘礼 解题报告【最短路/SPFA】
- POJ 1062 昂贵的聘礼 (最短路应用 Dijkstra算法)
- poj 1062 昂贵的聘礼 (dijkstra最短路)
- poj 1062 昂贵的聘礼 (dfs||最短路)
- POJ-1062 昂贵的聘礼( 最短路 )
- POJ 1062:昂贵的聘礼:简单的dij最短路变形