zoukankan      html  css  js  c++  java
  • hdu 1874 畅通project续(SPFA算法)

    本题链接:点击打开链接

    本题大意:

            输入n,m;代表有n个点。m条边。然后输入边权值及两个顶点。再输入起点和终点。求从起点到终点的最短路程,若不存在,输出-1。

    解题思路:

            主要的球最短路问题,使用SPFA算法从起点開始依次进行查找就可以。详细请參考代码:

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #define MAXN 220
    #define MAXM 1010
    #define INF 0x3f3f3f3f
    using namespace std;
    int head[MAXN];
    int mark[MAXN];
    int dis[MAXN];
    struct node{
    	int from,to,val,next;
    };
    node edge[MAXM];
    int n,m,num;
    void getmap(int u,int v,int w)
    {
    	node e={u,v,w,head[u]};
    	edge[num]=e;
    	head[u]=num++;
    }
    void SPFA(int s)
    {
    	queue<int>q;
    	memset(mark,0,sizeof(mark));
    	memset(dis,INF,sizeof(dis));
    	q.push(s);
    	mark[s]=1;
    	dis[s]=0;
    	while(!q.empty())
    	{
    		int top=q.front();
    		q.pop();
    		mark[top]=0;
    		for(int i=head[top];i!=-1;i=edge[i].next)
    		{
    			int u=edge[i].to;
    			if(dis[u]>dis[top]+edge[i].val)
    			{
    				dis[u]=dis[top]+edge[i].val;
    				if(!mark[u])
    				{
    					mark[u]=1;
    					q.push(u);
    				}
    			}
    		}
    	}
    }
    int main()
    {
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		memset(head,-1,sizeof(head));
    		num=0;
    		for(int i=0;i<m;i++)
    		{
    			int a,b,d;
    			scanf("%d%d%d",&a,&b,&d);
    			getmap(a,b,d);
    			getmap(b,a,d);
    		}
    		int s,e;
    		scanf("%d%d",&s,&e);
    		SPFA(s);
    		if(dis[e]==INF)
    			printf("-1
    ");
    		else
    			printf("%d
    ",dis[e]);
    	}
    	return 0;
    }


     

  • 相关阅读:
    uip UDPclient模式通信移植,p本地ort可以是无规
    正则表达式摘要
    Regular expression
    正则-合乎规则
    通配符-通配
    正则表达式总结
    判断大盘筑顶的方法
    筑顶和下跌规律
    股票的筑顶危险信号
    股票筑顶的基本特征
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7324147.html
Copyright © 2011-2022 走看看