poj 3635 Full Tank?
2011-03-17 10:44
274 查看
最近发现写程序就是策略的体现。
这题我看了一个头两个大,看了别人的解题报告,才知道是一种bfs dijkstra的结合体,给我一万个脑袋都想不出来,虽然那两种策略之前都略知一二,还是得不断做题。
其实这题我一开始是用深搜的,果断TLE,贴一下那个代码
这题我看了一个头两个大,看了别人的解题报告,才知道是一种bfs dijkstra的结合体,给我一万个脑袋都想不出来,虽然那两种策略之前都略知一二,还是得不断做题。
#include<iostream> #include<queue> using namespace std; #define N 1005 #define inf 100000000 struct node { int ver,fuel,cost; }; struct cmp{ bool operator()(node a,node b){ return a.cost>b.cost;} }; bool use [105]; int dp [105],p ; struct edge { int ver,dist; edge *next; }; edge *gragh ; priority_queue<node,vector<node>,cmp>q; void add_edge(int u,int v,int d) { edge *ptr=new edge; ptr->ver=v; ptr->dist=d; ptr->next=gragh[u]; gragh[u]=ptr; return ; } int dijkstra(int s,int e,int cap) { int cost,fuel,u,v,d; node a,temp; a.ver=s; a.fuel=a.cost=0; while(!q.empty()) q.pop(); q.push(a); while(!q.empty()) { a=q.top(); q.pop(); u=a.ver,fuel=a.fuel,cost=a.cost; use[u][fuel]=1; if(u==e) return cost; if(fuel+1<=cap&&!use[u][fuel+1]&& dp[u][fuel+1]>dp[u][fuel]+p[u]) { dp[u][fuel+1]=dp[u][fuel]+p[u]; temp.ver=u,temp.fuel=fuel+1,temp.cost=dp[u][fuel+1]; q.push(temp); } for(edge *ptr=gragh[u];ptr;ptr=ptr->next) { v=ptr->ver,d=ptr->dist; if(fuel>=d&&!use[v][fuel-d]&&dp[v][fuel-d]>cost) { dp[v][fuel-d]=cost; temp.ver=v,temp.fuel=fuel-d,temp.cost=dp[v][fuel-d]; q.push(temp); } } } return -1; } int main() { int n,m,i,j,d,q,s,e,cap,k; scanf("%d%d",&n,&m); for(k=0;k<n;k++) { scanf("%d",p+k); gragh[k]=NULL; } for(k=0;k<m;k++) { scanf("%d%d%d",&i,&j,&d); add_edge(i,j,d); add_edge(j,i,d); } scanf("%d",&q); while(q--) { scanf("%d%d%d",∩,&s,&e); memset(use,0,sizeof(use)); for(i=0;i<n;i++) for(j=0;j<=100;j++) dp[i][j]=inf; dp[s][0]=0; i=dijkstra(s,e,cap); if(i==-1) printf("impossible/n"); else printf("%d/n",i); } return 0; }
其实这题我一开始是用深搜的,果断TLE,贴一下那个代码
#include<iostream> using namespace std; #define N 1005 #define inf 1000000000 bool visited ; int p ,best,mind ; struct node { node *next; int dist,v; }; node *gragh ; void add_edge(int u,int v,int d) { node *ptr=new node; ptr->v=v; ptr->dist=d; ptr->next=gragh[u]; gragh[u]=ptr; return ; } void init(int n,int m) { int i,u,v,d; node *ptr; for(i=0;i<n;i++) scanf("%d",p+i); for(i=0;i<n;i++) gragh[i]=NULL; for(i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&d); add_edge(u,v,d); add_edge(v,u,d); } for(i=0;i<n;i++) mind[i]=inf; for(i=0;i<n;i++) for(ptr=gragh[i];ptr;ptr=ptr->next) if(ptr->dist<mind[i]) mind[i]=ptr->dist; return ; } void dfs(int cap,int remain,int mon,int v,int end) { int i; node *ptr; visited[v]=1; if(mon>=best) return ; if(v==end&&mon<best) { best=mon; return ; } for(i=mind[v]-remain>0?mind[v]-remain:0;i<=cap;i++) for(ptr=gragh[v];ptr;ptr=ptr->next) if(!visited[ptr->v]) { if(remain+i<ptr->dist) continue; dfs(cap,remain+i-ptr->dist,mon+p[v]*i,ptr->v,end); visited[ptr->v]=0; } return ; } int main() { int n,m,q,s,t,c; scanf("%d%d",&n,&m); init(n,m); scanf("%d",&q); for(int i=0;i<q;i++) { scanf("%d%d%d",&c,&s,&t); memset(visited,0,sizeof(visited)); best=inf; dfs(c,0,0,s,t); if(best==inf) printf("impossible/n"); else printf("%d/n",best); } return 0; }
相关文章推荐
- POJ 3635 Full Tank?
- POJ 3635 Full Tank(最短路径变形 + 优先队列)
- POJ-3635-Full Tank?
- POJ 3635 Full Tank?
- POJ 3635 Full Tank? 最短路变形
- poj 3635 Full Tank 最短路
- poj 3635 Full Tank 动态规划思想在spfa算法中的应用
- poj 3635 Full Tank? ( bfs+dp思想 )
- poj 3635 Full Tank? ( bfs+dp思想 )
- POJ 3635:Full Tank?
- poj 3635 Full Tank? 广搜?
- POJ 3635 Full Tank? (dp)
- poj 3635 Full Tank? ( 图上dp )
- POJ 3635 Full Tank?(BFS)
- POJ 3635 Full Tank?
- POJ-3635 Full Tank? 变形最短路
- poj 3635 Full Tank? (优先队列 + bfs)
- POJ 3635 Full Tank? 最短路DP
- POJ 3635 Full Tank? (最短路变形,BFS+优先队列)
- poj 3635(full tank?)