zoukankan      html  css  js  c++  java
  • hdu 2544 最短路

    稍微修改了一下hdu1874的代码就直接过了

    不过 31ms 缺陷,一大缺陷

    FSPA版:

    #include<iostream>
    #include<string>
    #include<algorithm>
    #define MAXN 110
    using namespace std;
    int  map[MAXN][MAXN]; //map[i,j]为初始输入的i到j的距离,未知的map[i,j]=INT_MAX;
    int  dis[MAXN],Q[MAXN*100];
    char vst[MAXN];
    // 参数n表示结点数,s表示源点
    int SPFA(int n, int s)
    {
    	// pri是队列头结点,end是队列尾结点
        int i, pri, end, p;
        memset(vst, 0, sizeof(vst));
    	 for(int i=0; i<MAXN; ++i)
            Q[i] = 0;
        for (i=1; i<=n; i++)
            dis[i] = INT_MAX;
        dis[s] = 0;
        vst[s] = 1;
        Q[1] = s; pri = 1; end = 2;
        while (pri < end)
        {
            p = Q[pri];
            for (i=1; i<=n; ++i)
            {
    			//更新dis
                if (map[p][i]!=INT_MAX&&dis[p]+ map[p][i]<dis[i])
                {
                    dis[i] = dis[p]+map[p][i];
                    if (!vst[i])     //未在队列中
                    {
                        Q[end++] = i;
                        vst[i] = 1;
                    }
                }
            }
            vst[p] = 0;   // 置出队的点为未标记
            pri++;
        }
        return 1;
    } 
    int main()
    {
    	int n,m;
    	while(cin>>n>>m&&(n||m))
    	{
    		for(int i=1;i<=n;i++)
    			for(int j=1;j<=n;j++)
    				map[i][j]=INT_MAX;
    		int a,b,len;
    		for(int i=0;i<m;i++)
    		{
    			cin>>a>>b>>len;
    			if(len<map[a][b])
    			{
    				map[a][b]=len;
    				map[b][a]=len;
    			}
    		}
    		SPFA(n,1);
    		cout<<dis[n]<<endl;
    	}
    	return 0;
    }
    

    dijkstra版:

    #include<iostream>
    #include<string>
    using namespace std;
    bool s[101];
    int c[110][110],dis[110],n,m;
    void dijkstra()
    {
    	for(int i=1;i<=n;i++)
    	{
    		dis[i]=c[1][i];
    	}
    	dis[1]=0;
    	for(int i=2;i<=n;i++)
    	{
    		int tmp=INT_MAX,v=1;
    		for(int j=1;j<=n;j++)
    			if(!s[j]&&dis[j]<tmp)
    			{
    				tmp=dis[j];
    				v=j;
    			}
    		s[v]=1;
    		for(int j=1;j<=n;j++)
    			if(!s[j]&&c[v][j]<INT_MAX)
    			{
    				int newdis=dis[v]+c[v][j];
    				if(newdis<dis[j])
    					dis[j]=newdis;
    			}
    	}
    }
    int main()
    {
    	int len;
    	while(cin>>n>>m&&(n||m))
    	{
    		for(int i=1;i<=n;i++)
    			for(int j=1;j<=n;j++)
    				c[i][j]=INT_MAX;
    		int a,b;
    		for(int k=0;k<m;k++)
    		{
    			cin>>a>>b>>len;
    			if(len<c[a][b])
    			{
    			 c[a][b]=len;
    			 c[b][a]=len;
    			}
    		}
    		memset(s,0,sizeof(s));
    		s[1]=1;
    		dijkstra();
    			cout<<dis[n]<<endl;
    	}
    	return 0;
    }
  • 相关阅读:
    密码框组件
    文本框组件
    列表框组件
    复选框组件
    单选按钮组件
    nginx for windows
    Mesa 3D
    下载服务器文件到本地
    消息服务
    Redis查看已注册的提供者消费者信息
  • 原文地址:https://www.cnblogs.com/nanke/p/2136591.html
Copyright © 2011-2022 走看看