现在的位置: 首页 > 综合 > 正文

poj-3159,SPFA+堆栈

2012年01月09日 ⁄ 综合 ⁄ 共 844字 ⁄ 字号 评论关闭

题目连接

分析:本题是通过最短路径来求差分约束问题。关于差分约束问题,为什么可以用最短路来求解。可以到网上找。

求最短路径,这题因为点比较多,所以用spfa写方便些。不过用列队会溢出,用循环列队会超时,所以这题可以用栈来实现。即节省空间,又可省时间。

代码:(弱弱地参考别人代码)

#include<cstdio>
#include<cstring>
#include<stack>
#define INF 1000000
using namespace std;
 
struct node{
	int x,w,next;
}edge[150005];

bool visit[30005];
int d[30005],head[30005];
int N,M;

void spfa()
{
	int i,k;
	stack<int>S;
	memset(visit,0,sizeof(visit));
	for(i=2;i<=N;i++) d[i]=INF; 
	d[1]=0;
	S.push(1),visit[1]=1;
	while(!S.empty()){
		k=S.top();
		S.pop();
		visit[k]=0;
	    for(i=head[k];i!=-1;i=edge[i].next){
			if(d[edge[i].x]>edge[i].w+d[k]){
				d[edge[i].x]=edge[i].w+d[k];
				if(!visit[edge[i].x]){
					S.push(edge[i].x);
					visit[edge[i].x]=1;
				}
			}
			
	    }
	}
	printf("%d\n",d[N]);
}

int main() 
{
	int x,w,v,i;
    while(scanf("%d%d",&N,&M)!=EOF){
		memset(head,-1,sizeof(head));
		for(i=1;i<=M;i++){
		 scanf("%d%d%d",&x,&w,&v);
		 edge[i].x=w;
		 edge[i].w=v;
		 edge[i].next=head[x];
		 head[x]=i;
		}
		spfa();
  }	
  return 0;
}

抱歉!评论已关闭.