您的位置:首页 > 其它

poj 3159 Candies(差分约束 spfa stack实现)

2013-11-09 15:49 387 查看
/*
又是一道差分约束的题目。。。一样的,又被卡了好久 - -。
题目意思很好懂。
这个差分约束用spfa的主要就是spfa要用stack实现而不能用queue来实现。
这个就体现出stack实现的快速优势。
用queue会光荣的交上一次tle
可以用stl里的stack,也可自己写,自己写的要比stl的快的多。
我在下面都给出了,应该是自己写的stack要比stl的stack要快200ms左右,还是很可观的。
*/

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 30010;
int n,m;
typedef struct
{
int to;
int next;
int w;
} Node;
Node edge[N*5];
int dis
;
int vis
;
int head
;
int inqueue
;
int num_edge;
void addedge(int a,int b,int w)
{
edge[num_edge].to = b;
edge[num_edge].w = w;
edge[num_edge].next = head[a];
head[a] = num_edge++;
}

/****************************************************************************************/

bool spfa(int start)/*stl stack 实现*/
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
stack<int>s;
s.push(start);
vis[start] = true;
dis[start] = 0;
inqueue[start]++;
while(!s.empty())
{
int cur = s.top();
s.pop();
for(int i = head[cur] ; i != -1 ; i = edge[i].next)
{
int x = edge[i].to;
if(dis[x] > dis[cur] + edge[i].w )
{
dis[x] = dis[cur] + edge[i].w;
if(!vis[x])
{
s.push(x);
vis[x] = true;

inqueue[x]++;
if(inqueue[x] > n)
{
return false;
}
}
}
}
vis[cur] = false;
}
return true;
}

/*******************************************************************************************/

/*******************************************************************************************/

int s
;/*数组模拟stack 实现,效率比stl要快*/

bool spfa(int start)
{
int top;
memset(dis,0x3f,sizeof(dis));
memset(vis,false,sizeof(vis));
dis[start] = 0;
s[0] = start;
top = 1;
vis[start] = true;
while(top)
{
int cur = s[--top];
for(int i = head[cur] ; i != -1 ; i = edge[i].next)
{
int x = edge[i].to;
if(dis[x] > dis[cur] + edge[i].w)
{
dis[x] = dis[cur] + edge[i].w;
if(!vis[x])
{
s[top++] = x;
vis[x] = true;
}
}
}
vis[cur] = false;
}
return true;
}

/**********************************************************************************************************/

int main()
{
while(scanf("%d %d",&n,&m) != EOF)
{
memset(head,-1,sizeof(head));
int a,b,w;
num_edge = 0;
for(int i = 0 ; i < m ; i++)
{
scanf("%d %d %d",&a,&b,&w);
addedge(a,b,w);
}
spfa(1);
cout<<dis
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: