zoukankan      html  css  js  c++  java
  • zzuoj 10408: C.最少换乘【最短路dijkstra】

    10408: C.最少换乘

    Time Limit: 2 Sec  Memory Limit: 128 MB
    Submit: 31  Solved: 8
    [Submit][Status][Web Board]

    Description

        欧洲某城是一个著名的旅游胜地,每年都有成千上万的人前来观光旅行。Dr. Kong决定利用暑假好好游览一番。。

    年轻人旅游不怕辛苦,不怕劳累,只要费用低就行。但Dr. Kong年过半百,他希望乘坐BUS从住的宾馆到想去游览的景点,期间尽可量地少换乘车。

     

    Dr. Kon买了一张旅游地图。他发现,市政部门为了方便游客,在各个旅游景点及宾馆,饭店等地方都设置了一些公交站并开通了一些单程线路。每条单程线路从某个公交站出发,依次途经若干个站,最终到达终点站。

    但遗憾的是,从他住的宾馆所在站出发,有的景点可以直达,有的景点不能直达,则他可能要先乘某路BUS坐上几站,再下来换乘同一站的另一路BUS, 这样须经过几次换乘后才能到达要去的景点。

     

    为了方便,假设对该城的所有公交站用12……N编号。Dr. Kong所在位置的编号为1,他将要去的景点编号为N

    请你帮助Dr. Kong寻找一个最优乘车方案,从住处到景点,中间换车的次数最少。

    Input

    第一行:     K             表示有多少组测试数据。(2k8

    接下来对每组测试数据:

    1:       M  N        表示有M条单程公交线路,共有N站。(1<=M<=100 1<N<=500

    2~M+1行:每行描述一路公交线路信息,从左至右按运行顺序依次给出了该线路上的所有站号,相邻两个站号之间用一个空格隔开。

    Output

    对于每组测试数据,输出一行,如果无法乘坐任何线路从住处到达景点,则输出"N0",否则输出最少换车次数,输出0表示不需换车可以直达。

    Sample Input

    2
    3 7
    6 7
    4 7 3 6
    2 1 3 5
    2 6
    1 3 5 
    2 6 4 3
    

    Sample Output

    2
    NO
    
    此题属于常规的最短路问题,但建图特别坑
    1、输入数据时需要先以字符串的形式输入(注意吸收回车)然后在转化为数字
    2、转化为数字时注意车站号为2位三位数的情况
    #include<stdio.h>
    #include<string.h>
    #define MAX 1100
    #define inf 0x3ffffff
    int n,m;
    char s[MAX];
    int vis[510];
    int r[510];
    int low[510],map[510][510];
    void init()
    {
    	int i,j;
        for(i=1;i<=m;i++)
        {
        	for(j=1;j<=m;j++)
        	{
        		if(i==j)
        		map[i][j]=0;
        		else
        		map[i][j]=inf;
    		}
    	}
    }
    void getmap()
    {
    	int len,i,j,k,t;
    	int sum;
    	getchar();
    	while(n--)
    	{
    		gets(s);
    		t=0;
    		for(i=0;i<strlen(s);i++)
    		{
    			if(s[i]!=' ')
    			{
    				sum=0;
    				while(s[i]!=' '&&i<strlen(s))//考虑车站号为2或3位数 
    				{
    					sum=sum*10+(s[i]-'0');
    					i++;
    				}
    			    r[t++]=sum;
    			}
    		} 
    		for(i=0;i<t-1;i++)
    		{
    			for(j=i+1;j<t;j++)
    			{
    				map[r[i]][r[j]]=1;
    			}
    		}
    	} 
    }
    void dijkstra()
    {
    	int i,j,min,next;
    	memset(vis,0,sizeof(vis));
    	for(i=1;i<=m;i++)
    	    low[i]=map[1][i];
    	vis[1]=1;
    	for(i=1;i<m;i++)
    	{
    		min=inf;
    		for(j=1;j<=m;j++)
    		{
    			if(!vis[j]&&min>low[j])
    			{
    				min=low[j];
    				next=j;
    			}
    		}
    		vis[next]=1;
    		for(j=1;j<=m;j++)
    		{
    			if(!vis[j]&&low[j]>low[next]+map[next][j])
    			    low[j]=low[next]+map[next][j];
    		}
    	}
    	if(low[m]!=inf)
    	printf("%d
    ",low[m]-1);
    	else
    	printf("NO
    ");
    }
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%d%d",&n,&m);
    		init();//初始化 
    		getmap();	//建图 
    		dijkstra();//求最短路 
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Tomcat5配置mysql
    Eclipse完全手册
    MBR是什么
    必杀技公布——用特征码定位关键代码,秒杀MFC程序
    Google C++编程命名约定
    认识硬盘主引导扇区
    c++ const 用法详解
    主引导区
    C++ 关于struce结构体字节对齐
    Fedora 显示设备配置工具介绍
  • 原文地址:https://www.cnblogs.com/tonghao/p/4719222.html
Copyright © 2011-2022 走看看