zoukankan      html  css  js  c++  java
  • poj3159,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;
    }


  • 相关阅读:
    C++中的函数
    C++基本语句
    面向对象程序设计
    数据结构中的算法
    数据结构开篇
    条件编译
    文件包含
    简单的宏替换
    系统启动过程
    parted 命令学习
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3100553.html
Copyright © 2011-2022 走看看