poj-3159,SPFA+堆栈

题目连接

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

求最短路径,这题因为点比较多,所以用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;

}


 

 

你可能感兴趣的:(SPFA)