poj 1502 MPI Maelstrom SPFA 用队列来优化

题目链接

典型的求最短路径的问题,从1这个节点开始求解~~

找出距离1最远的最短路径。

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <map>
#include <vector>
#include <math.h>
#include <queue>
#include <stdlib.h>
#define maxn 1000
#define INF 100000000
using namespace std;
vector < pair <int,int> > g[maxn+10];
char ch[10000],ans[100];
int node,edge,src;
int dis[maxn+10];
bool inQueue[maxn+10];
queue<int> que;
pair <int,int> suit;
void SPFA(){
      for (int i=0;i<=node;i++)
          dis[i]=INF;
      memset(inQueue,false,sizeof(int)*(node+5));
      dis[src]=0;
      while(!que.empty()){
      		que.pop();
      }
      que.push(src);
      inQueue[src]=true;
      while(!que.empty()){
      		int u=que.front();
      		que.pop();
      		for(int i=0; i!=g[u].size(); i++){
      			if ( dis[u] + g[u][i].second <dis[g[u][i].first] ){   //这里要写上从u开始的距离。
  					//printf(": %d %d\n",u,g[u][i].first);
					 //printf(":  %d %d\n",dis[u],g[u][i].second);
  					dis[g[u][i].first] = dis[u] + g[u][i].second;
  					//printf(" :  %d\n",dis[g[u][i].first]);
//  					printf(": %d %d\n",u,g[u][i].first);
                    if (!inQueue[g[u][i].first]){
                       inQueue[g[u][i].first] = true;
                       que.push(g[u][i].first);
  					}
      			}
      		}
      		inQueue[u]=false;
      }

}



int main()
{
    while( scanf("%d",&node)!=EOF ){
    	getchar();
        for(int i=2; i<=node; i++){
        	gets(ch);
        	int add,ji=1;
        	char *p=ch;
            while(sscanf(p,"%s%n",ans,&add)!=EOF){
                if(ans[0]=='x'){ji++;p=p+add;continue;}  //注意这里 忘了赋值ji++了 导致邻接链表更新错误了。
                suit.second=atoi(ans);
                suit.first=ji;
                g[i].push_back(suit);
                suit.first=i;
                g[ji].push_back(suit);
                p=p+add;
                ji++;
            }
        }
            src=1;
            SPFA();
            int max=-1;
            for(int i=1;i<=node;i++){
            	if( max < dis[i] )
            		max=dis[i];
            }
            printf("%d\n",max);
        

    }
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值