poj 1062 昂贵的聘礼(最短路 dijk+枚举)
2013-08-09 15:52
253 查看
终于A 了,这题做着真麻烦
题目:http://poj.org/problem?id=1062
dijk 一般用于正权有向图
此题的关键在于等级限制的处理,最好的办法是采用枚举,即假设酋长等级为5,等级限制为2,那么需要枚举等级从3~5,4~6,5~7
题意就不用说了,做poj以来的第一道中文题目。
要考虑间接身份差异不可行的情况
如:1 4
10000 3 2
2 1
3 3
1000 2 2
4 1
3 1
1000 3 1
4 2
100 4 0
错误程序出104,答案105。
对于这组数据错误的程序是4->3->2->1的,但4和2不能并存
题目:http://poj.org/problem?id=1062
dijk 一般用于正权有向图
此题的关键在于等级限制的处理,最好的办法是采用枚举,即假设酋长等级为5,等级限制为2,那么需要枚举等级从3~5,4~6,5~7
题意就不用说了,做poj以来的第一道中文题目。
要考虑间接身份差异不可行的情况
如:1 4
10000 3 2
2 1
3 3
1000 2 2
4 1
3 1
1000 3 1
4 2
100 4 0
错误程序出104,答案105。
对于这组数据错误的程序是4->3->2->1的,但4和2不能并存
#include <iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<stack> #include<queue> #include<cmath> #include<algorithm> using namespace std; int lim[200]; const int INF=1<<28; int n; struct no { int p,l,x,a[150],b[150]; } thing[200]; struct node { int u,v,w,next; } edge[20000]; int head[200],dis[200],cnt; void add(int u,int v,int w) { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } int dijkstra(int s) { int vis[200],i,j,min; for(i=1; i<=n; i++) dis[i]=INF; memset(vis,0,sizeof(vis)); dis[s]=0; for(i=1; i<=n; i++) { int minn=INF; int u=s; for(j=1; j<=n; j++) { if(!vis[j] && minn>dis[j] &&lim[j]) //lim标记是否在限制条件内 { minn=dis[j]; u=j; } } for(j=head[u]; j!=-1; j=edge[j].next) { int v=edge[j].v; int newdis=minn+edge[j].w; if(!vis[v] && newdis < dis[v] && lim[v])//lim标记是否在限制条件内 dis[v]= newdis; } vis[u]=1; } min=thing[1].p; for(i=2; i<=n; i++) //一组完成后 比较 { if(dis[i]+thing[i].p<min) min=dis[i]+thing[i].p; } return min; } int main() { int m,i,j,ans; scanf("%d%d",&m,&n); cnt=0; memset(head,-1,sizeof(head)); for(i=1; i<=n; i++) { scanf("%d%d%d",&thing[i].p,&thing[i].l,&thing[i].x); for(j=1; j<=thing[i].x; j++) { scanf("%d%d",&thing[i].a[j],&thing[i].b[j]); } } for(i = 1; i <= n; i++) //其实我这一步没什么必要,当时想少了,下一步就可以搞定 { for(j=1; j<=thing[i].x; j++) { if(abs(thing[i].l-thing[thing[i].a[j]].l)<=m) add(i,thing[i].a[j],thing[i].b[j]);//倒着建的图 } } ans=thing[1].p; for(i=m; i>=0; i--) { memset(lim,0,sizeof(lim)); for(j=1; j<=n; j++) //枚举 { if(thing[j].l>=(thing[1].l-i)&&thing[j].l<=(thing[1].l+m-i)) lim[j]=1; } if(dijkstra(1)<ans) ans=dijkstra(1); } printf("%d\n",ans); return 0; }
相关文章推荐
- POJ - 1062 昂贵的聘礼(最短路Dijkstra)
- POJ1062 昂贵的聘礼(最短路)
- 昂贵的聘礼 POJ - 1062 (限制型最短路)
- POJ 1062 昂贵的聘礼【最短路】
- [POJ 1062]昂贵的聘礼[最短路][枚举]
- poj 1062 昂贵的聘礼 【枚举最短路】
- POJ 1062 昂贵的聘礼 最短路
- [poj1062]昂贵的聘礼_最短路_离散化
- POJ 1062 昂贵的聘礼(限制的最短路)
- poj 1062 最短路(昂贵的聘礼)
- POJ - 1062昂贵的聘礼最短路或者DFS
- poj1062 昂贵的聘礼 (最短路)
- POJ 1062:昂贵的聘礼:简单的dij最短路变形
- poj 1062 昂贵的聘礼 最短路
- poj1062昂贵的聘礼(题解)最短路
- POJ 1062 昂贵的聘礼 (最短路)
- POJ 1062 : 昂贵的聘礼 - 最短路Dijkstra+枚举(难)
- (POJ 1062)昂贵的聘礼 在可选的顶点中求最短路 dijkstra + 枚举
- POJ1062---昂贵的聘礼(最短路:题意。。)
- POJ 1062 昂贵的聘礼 【枚举 + 最短路】