您的位置:首页 > 其它

POJ 1724 ROADS(二维SPFA)

2013-07-06 19:08 309 查看
题目链接

用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: