POJ 1724 ROADS(二维SPFA)
2013-07-06 19:08
309 查看
题目链接
用STL实现超时了,用普通队列500+,看到spfa,反应太迟钝了。
用STL实现超时了,用普通队列500+,看到spfa,反应太迟钝了。
#include <cstring> #include <cstdio> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; #define INF 0x7fffffff int d[101][10001]; int first[101]; bool in[101][10001]; int q1[10000001]; int q2[10000001]; int t,k,n; struct node { int u,v,w,next,c; }edge[10001]; void CL() { t = 1; memset(first,-1,sizeof(first)); } void add(int u,int v,int w,int c) { edge[t].u = u; edge[t].v = v; edge[t].w = w; edge[t].c = c; edge[t].next = first[u]; first[u] = t ++; } int spfa(int str,int end) { int x,y,v,i,j,ans,l,r; for(i = 1;i <= end;i ++) { for(j = 0;j <= k;j ++) { in[i][j] = 0; d[i][j] = INF; } } l = r = 1; q1[1] = str; q2[1] = 0; in[str][0] = 1; d[str][0] = 0; while(l <= r) { x = q1[l]; y = q2[l]; l ++; in[x][y] = 0; for(i = first[x];i != -1;i = edge[i].next) { v = edge[i].v; if(y + edge[i].c <= k) { if(d[v][y+edge[i].c] > d[x][y] + edge[i].w) { d[v][y+edge[i].c] = d[x][y] + edge[i].w; if(!in[v][y+edge[i].c]) { r ++; q1[r] = v; q2[r] = y+edge[i].c; in[v][y+edge[i].c] = 1; } } } } } ans = INF; for(i = 0;i <= k;i ++) { ans = min(ans,d[end][i]); } return ans; } int main() { int m,sv,ev,w,c,ans,i; scanf("%d%d%d",&k,&n,&m); CL(); for(i = 1;i <= m;i ++) { scanf("%d%d%d%d",&sv,&ev,&w,&c); add(sv,ev,w,c); } ans = spfa(1,n); if(ans == INF) printf("-1\n"); else printf("%d\n",ans); return 0; }
相关文章推荐
- Poj 1724 ROADS【二维限制最短路+SPFA】
- (poj 1724 ROADS)<二维最短路+DP>
- 【POJ】1724 ROADS 二维最短路
- [POJ 1724]ROADS[SPFA][DFS剪枝]
- poj 1724 ROADS 搜索
- poj 1724 ROADS
- POJ1724 ROADS [最短路变形 二维dp+spfa]
- 【poj 1724】ROADS 题意&题解&代码(C++)
- poj 1724 ROADS条件限制下的最短路径
- poj 1724 ROADS
- 深搜+剪枝 POJ 1724 ROADS
- poj 1724 ROADS条件限制下的最短路径
- POJ 1724 ROADS 最短路 邻接表 + bfs +优先队列
- poj 1724 ROADS(dfs)||(优先队列+dijkstra)
- poj 1724 ROADS
- POJ 1724 ROADS
- POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)
- poj 1724 ROADS
- poj 1724 ROADS条件限制下的最短路径
- POJ 1724 ROADS [dijkstra+heap]