• 最短路


    最短路

    Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 91   Accepted Submission(s) : 59
    Problem Description
    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

     

    Input
    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B& lt;=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。输入保证至少存在1条商店到赛场的路线。
     

    Output
    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     

    Sample Input
    2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
     

    Sample Output
    3 2
     

    Source
    UESTC 6th Programming Contest Online
     

     
     
     
     
    #include<stdio.h>
    #include<string.h>
    #define INF 0xfffffff
    int map[200][200];
    int main()
    {
        int m,n,i,j,k;
        while(scanf("%d%d",&m,&n),m|n)
        {
            int a,b,c;
            for(i=1;i<=m;i++)
            {
                for(j=1;j<=m;j++)
                map[i][j]=map[j][i]=INF;
            }
            for(i=0;i<n;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                if(c<map[a][b])
                map[a][b]=map[b][a]=c;
            }
            for(k=1;k<=m;k++)
            for(i=1;i<=m;i++)
            for(j=1;j<=m;j++)
            {
                if(i==j)
                continue;
                if(map[i][j]>map[i][k]+map[k][j])
                map[i][j]=map[i][k]+map[k][j];
            }
            printf("%d
    ",map[1][m]);
        }
        return 0;
    }


    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<algorithm>
    using namespace std;
    #define INF 0x3f3f3f
    int vis[10100],dis[10100],m,n,cnt;
    int head[10100];
    struct node 
    {
    	int u,v,val;
    	int next;
    }edge[10100];
    void add(int u,int v,int val)
    {
    	edge[cnt].u=u;
    	edge[cnt].v=v;
    	edge[cnt].val=val;
    	edge[cnt].next=head[u];
    	head[u]=cnt++;
    }
    void spfa(int st)
    {
    	queue<int>q;
    	q.push(st);
    	memset(dis,INF,sizeof(dis));
    	memset(vis,0,sizeof(vis));
    	vis[st]=1;
    	dis[st]=0;
    	while(!q.empty())
    	{
    		int u=q.front();
    		q.pop();
    		vis[u]=0;
    		for(int i=head[u];i!=-1;i=edge[i].next)
    		{
    			int v=edge[i].v;
    			if(dis[v]>dis[u]+edge[i].val)
    			{
    				dis[v]=dis[u]+edge[i].val;
    				if(!vis[v])
    				{
    					vis[v]=1;
    					q.push(v);
    				}
    			}
    		}
    	}
    	printf("%d
    ",dis[m]);
    }
    int main()
    {
    	while(scanf("%d%d",&m,&n),m||n)
    	{
    		int a,b,c;
    		memset(head,-1,sizeof(head));
    		cnt=0;
    		while(n--)
    		{
    			scanf("%d%d%d",&a,&b,&c);
    			add(a,b,c);
    			add(b,a,c);
    		}
    		spfa(1);
    	}
    	return 0;
    }


  • 相关阅读:
    【转】2008年中国.NET技术应用趋势分析
    VB计算器(给上学需要应付作业的应个急)
    创业失败的18个原因
    使用ChilkatDotNet组件构建网络爬虫程序
    使用文本编辑器开发和部署一个ASP.NET Web应用程序
    优化 SQL Server 查询性能
    【转】sql性能优化方法
    使用 SOS 对 Linux 中运行的 .NET Core 进行问题诊断
    MultiThread Of Member Functions
    汇编 中断调用表 (中断向量表)
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273823.html
Copyright © 2020-2023  润新知