zoukankan      html  css  js  c++  java
  • 海岛争霸

    http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1248

    描述

    神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王。 这是一个由海洋、岛屿和海盗组成的危险世界。杰克船长准备从自己所占领的岛屿A开始征程,逐个去占领每一个岛屿。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。

    杰克船长手头有一张整个海域的海图,上面详细地记录了各个海屿的位置,以及海屿之间的通航路线。但他发现,有的航海路线太危险了,杰克船长的战船很难直接通过,他必须想方设法绕道航行;还有的岛屿根本到达不了。

    杰克船长现在想把航行的危险程度降到最小。具体地来说,就是杰克船长提出若干个询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少。

    输入

    第1行: N M 表示有N个岛屿,M条直航路线
    第2~M+1行: A B V 表示从岛屿A到岛屿B的航海路线的危险程度值为V。
    接下面一行 : Q 表示询问的次数。
    之后有Q个行: A B 表示询问从岛屿A 到岛屿B 所经过的航线,危险程度最小值
    1<N≤100 0<M≤500 1≤ Q≤20 0 < V≤1000,
    所有数据都是正整数。输入数据之间有一个空格。

    输出

    对于每个询问,输出占一行,一个整数,表示从岛屿A 到岛屿B 所经过的航线,危险程度最小值;若从岛屿A 无法到达岛屿B,则输出-1。

    样例输入

    10 8
    1 2 5
    1 3 2
    2 3 11
    2 4 6
    2 4 4
    6 7 10
    6 10 5
    10 7 2
    5
    2 3
    1 4
    3 7
    6 7
    8 3

    样例输出

    5
    5
    -1
    5
    -1

    dfs算法

    #include <stdio.h>  
    #include <string.h>  
    #define N 210  
    int dis[N];  
    int book[N];  
    int e[N][N];  
    int inf=99999999;  
    int n,m,min,max,s,t,sum;  
    int dfs(int cur)
    {  
        int i,flag,ff=max;  
        for(i=1;i<=n;i++)  
        {  
            if(e[cur][i]<inf&&e[cur][i]!=0&&book[i]==0)  
            {     
                if(e[cur][i]>max)  
                {  
                    ff=max;flag=1;  
                    max=e[cur][i];  
                }   
                if(i==t&&min>max)  
                    min=max;  
                book[i]=1;  
                dfs(i);  
                book[i]=0;  
                if(flag==1)  
                    max=ff;  
                flag=0;    
                for(int j=1;j<=n;j++)  
                    if(book[j]==1)  
                        sum++;  
                if(sum==n)  
                    break;  
            }  
        }  
        if(min>=inf)  
            return -1;  
        else 
            return min;  
    }  
       
    int main()  
    {  
        int a,b,v,q;  
        int i,j;  
        while(scanf("%d%d",&n,&m)!=EOF)  
        {  
            for(i=1;i<=n;i++)  
                for(j=1;j<=n;j++)  
                {  
                    if(i==j)  
                        e[i][j]=0;  
                    else 
                        e[i][j]=inf;  
                }  
            for(i=1;i<=m;i++){  
                scanf("%d%d%d",&a,&b,&v);  
                if(v<e[a][b])  
                    e[a][b]=e[b][a]=v;  
            }  
            scanf("%d",&q);  
            while(q--)  
            {  
                memset(dis,0,sizeof(dis));    
                memset(book,0,sizeof(book));  
                scanf("%d%d",&s,&t);  
                book[s]=1;    
                max=0;  
                min=inf;   
                sum=0;  
                int f=dfs(s);  
                printf("%d
    ",f);  
            }  
        }  
        return 0;  
    } 

    Dijkstra算法

    #include<stdio.h>
    #include<string.h>
    #define N 1020
    int e[N][N],dis[N],book[N];
    int max(int a,int b)
    {
    	return a>b?a:b;
    }
    int main()
    {
    	int i,j,m,n,s,t,T,a,b,c,min,u,v,inf=99999999;
    	scanf("%d%d",&n,&m);
    	for(i=1;i<=n;i++)
    		for(j=1;j<=n;j++)
    			if(i!=j)
    				e[i][j]=inf;
    	while(m--)
    	{
    		scanf("%d%d%d",&a,&b,&c);
    		if(e[a][b]>c)
    			e[a][b]=e[b][a]=c;
    	}
    	scanf("%d",&T);
    	while(T--)
    	{
    		scanf("%d%d",&s,&t);
    		memset(book,0,sizeof(book));
    		book[s]=1;
    		for(i=1;i<=n;i++)
    			dis[i]=e[s][i];
    		for(i=1;i<=n;i++)
    		{
    			min=inf;
    			for(j=1;j<=n;j++)
    				if(dis[j]<min&&book[j]==0)
    				{
    					min=dis[j];
    					u=j;
    				}
    			book[u]=1;
    			for(v=1;v<=n;v++)
    				if(dis[v]>max(dis[u],e[u][v]))
    					dis[v]=max(dis[u],e[u][v]);
    		}
    		if(dis[t]==inf)
    			printf("-1
    ");
    		else
    			printf("%d
    ",dis[t]);
    	}
    	return 0;
    }
  • 相关阅读:
    Git 几个常用操作
    Ubuntu16.04安装YouCompleteMe
    常用命令总结
    启动Kernel提示Bad Data CRC
    linux4.15.1编译init/mounts报错
    编译Linux-4.15.1内核时遇到:“error : openssl/bio.h :No such file or folder”
    添加mtdparts引起的问题
    arm-linux-ld:u-boot.lds:1: ignoring invalid character `#' in expression
    smartgit的安装
    ubuntu下安装wine
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/10002956.html
Copyright © 2011-2022 走看看