zoukankan      html  css  js  c++  java
  • zoj Heavy Cargo

    题目的意思是选择路径并使从 i 到 j 的路径上最小承受重量最大化。

    动态规划,类似floyd,用dist[ i ][ j ]表示从 i 到 j 的最小重量,枚举中间节点 k ,则状态转移方程可写为dist[ i ][ j ] = max ( dist[ i ] [ j ], min ( dist[ i ][ k ],dist[ k ][ j ]))。

    index为命名函数,将英文名转换为标号。

    #include <stdio.h>
    #include <string.h>
    #define INF 5000000
    int n,r,num,dist[300][300];
    char city[300][50];
    char start[50],dest[50];
    int max(int a,int b)
    {
    	if(a>b) return a;
    	else return b;
    }
    int min(int a,int b)
    {
    	if(a>b) return b;
    	else return a;
    }
    int index(char* s)
    {
    	int i;
    	for(i=0;i<num;i++)
    		if(strcmp(city[i],s)==0)
    			return i;
    	strcpy(city[i],s);
    	num++;
    	return i;
    }
    
    void floyd()
    {
    	int k,i,j;
    	for(k=0;k<n;k++)
    		for(i=0;i<n;i++)
    			for(j=0;j<n;j++)
    				dist[i][j]=max(dist[i][j],min(dist[i][k],dist[k][j]));
    }
    
    int main()
    {
    	int i,j,w,k,sum=0;
    	while(1)
    	{
    		num=0;
    		scanf("%d%d",&n,&r);
    		if(n==0&&r==0)
    			break;
    		for(i=0;i<n;i++)
    			for(j=0;j<n;j++)
    				dist[i][j]=0;
    		for(i=0;i<n;i++)
    			dist[i][i]=INF;
    		for(k=0;k<r;k++)
    		{
    			scanf("%s%s%d",start,dest,&w);
    			i=index(start);
    			j=index(dest);
    			dist[j][i]=dist[i][j]=w;
    		}
    		floyd();
    		scanf("%s%s",start,dest);
    		i=index(start);
    		j=index(dest);
    		sum++;
    		printf("Scenario #%d
    ",sum);
    		printf("%d tons
    
    ",dist[i][j]);
    	}
    	return 0;
    }


     

  • 相关阅读:
    DHCP脚本
    7.31
    7.30
    7.26
    7.24
    VLAN与三层交换机
    静态路由配置
    7.17
    四次挥手
    TCP三次握手,四次挥手
  • 原文地址:https://www.cnblogs.com/vermouth/p/3710224.html
Copyright © 2011-2022 走看看