已知一系列依赖关系, 求解并输出正常的服务器

  • 题设
    假设服务器aM依赖于服务器aN, 用aM-aN表示, 并且这种依赖关系可以传递, 服务器总数量小于3000. 现有一些列的服务器依赖关系和损坏的服务器, 编程升序输出所有可以正常工作的服务器, 输入输出格式严格按照下面是示例, 输入依赖aM-aN间以逗号分隔,第二行为损坏的服务器,也以逗号分隔, 第三行输出正常的服务器, 以逗号分隔.

    输入示例:
    a1-a2,a3-a4,a5-a1,a4-a6
    a2
    输出
    a3,a4,a6


  • 纯c求解

    /*
     * @author: garret
     * @date:  2020/07/15
     * @comipler: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
     */
    #include <stdio.h>
    #include <string.h>
    #include <assert.h>
    
    #define MAX_SV 3000
    
    struct dep_sv
    {
    	char srv[6];
    	char match[6];
    };
    
    int get_num(char *str)
    {
    	int i = 0;
    	while ('-' != (str[i]))
    	{
    		i ++;
    	}
    	return i;
    }
    
    /*
     * @author: garret
     * @dsp: use rescursion to find dependences.
     */
    int is_brk(char (*brk)[6], struct dep_sv *deps, int total_brk, int total_dep, char *sv)
    {
    	int i = 0, j = 0, k = 0;
    
    	for (i = 0; i < total_brk; i++)
    	{
    		if (!strcmp(*(brk+i), sv))
    		{
    			return 1;
    		}
    	}
    
    	for (i = 0; i < total_dep; i++)
    	{
    		//printf("%s(%d)\n", __func__, __LINE__);
    		for (j = 0; j < total_brk; j++)
    		{
    			//printf("(%d): srv = %s, brk+j str = %s, sv = %s\n",__LINE__, (deps+i)->srv, *(brk+j), sv);
    			if (!strcmp((deps+i)->srv, sv))
    			{
    				if (!strcmp((deps+i)->match, *(brk+j)))
    				{
    					//printf("%s(%d)\n", __func__, __LINE__);
    					return 1;
    				}
    				else
    				{
    					for (k = 0; k < total_brk; k++)
    					{
    						//printf("(%d) srv = %s, (deps+i)->match) = %s\n", __LINE__, (deps+k)->srv, (deps+i)->match);
    						if (!strcmp((deps+k)->srv, (deps+i)->match))
    						{
    							if (!strcmp((deps+k)->match, *(brk+j)))
    							{
    								return 1;
    							}
    							else
    							{
    								//printf("%s(%d)\n", __func__, __LINE__);
    								is_brk(brk, deps, total_brk, total_dep, (deps+k)->match); 
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	return 0;
    }
    
    int bubble_sort(char (*str)[6], int num)
    {
    	int i, j;
    	char tmp[6];
    	for (i = 0; i < num-1; i++)
    	{
    		for (j = 0; j < num-1-i; j++)
    		{
    			//printf("%s(%d) i=%d j=%d num = %d \n", __func__, __LINE__, i,j, num);
    			if ((strlen(*(str+j)) > strlen(*(str+j+1))) || \
    				((strlen(*(str+j)) == strlen(*(str+j+1))) && strncmp(*(str+j), *(str+j+1), 6) > 0))
    			{
    				//printf("%s(%d)\n", __func__, __LINE__);
    				strncpy(tmp, *(str+j), 6);
    				strncpy(*(str+j), *(str+j+1), 6);
    				strncpy(*(str+j+1), tmp, 6);
    			}
    		}
    	}
    	return 0;
    }
    
    int is_exsited(char (*str)[6], char *srv, int num)
    {
    	int i;
    	for (i = 0; i < num + 1; i++)
    	{
    		if (!strncmp(*(str+i), srv, 6))
    		{
    			return 1;
    		}
    	}
    	return 0;
    }
    
    int main()
    {
        char dep_str[MAX_SV*14];
    	char delm[2] = ",";
    	char orig_deps[MAX_SV/2][14];
        struct dep_sv deps[MAX_SV/2];
    
        char brk_str[MAX_SV*14];
    	char brk_sv[MAX_SV][6];
    
    	//fgets(dep_str, MAX_SV*14-1, stdin);
    	scanf("%s", dep_str);
    
    	int i = 0;
    	int j = 0;
    
    	char *str1 = strtok(dep_str, delm);
    	while (str1 != NULL)
    	{
    		j = get_num(str1);
    		//printf("%d\n", j);
    		
    		snprintf(deps[i].srv, j+1, "%s", str1);
    		snprintf(deps[i].match, 6, "%s", str1+j+1);
    		//printf("%s %s\n", deps[i].srv, deps[i].match);
    		assert(strlen(deps[i].srv) > 1);
    		assert(strlen(deps[i].match) > 1);
    
    		str1 = strtok(NULL, delm);
    		i ++;
    	}
    	int total_dep = i;
    
    	i = 0;
    	scanf("%s", brk_str);
    	char *str2 = strtok(brk_str, delm);
    	while (str2 != NULL)
    	{
    		assert(strlen(str2) > 1);
    		strncpy(brk_sv[i], str2, 6);
    		//printf("%s\n", brk_sv[i]);
    		str2 = strtok(NULL, delm);
    		i ++;
    	}
    	int total_brk = i;
    	//printf("%d\n", total_brk);
    
    	char normal_srv[MAX_SV][6] = {'\0'};
    	int total_normal = 0;
    
    	//printf("total_dep = %d, total_brk = %d\n", total_dep, total_brk);
    
    	for (i = 0; i < total_dep; i++)
    	{
    		if (!is_brk(brk_sv, deps, total_brk, total_dep, (deps+i)->srv))
    		{
    			if (!is_exsited(normal_srv, (deps+i)->srv, total_normal))
    			{
    				//printf("%s(%d)\n", __func__, __LINE__);
    				strncpy(normal_srv[total_normal], (deps+i)->srv, 6);
    				total_normal ++;
    			}
    		}
    
    		if (!is_brk(brk_sv, deps, total_brk, total_dep, (deps+i)->match))
    		{
    			if (!is_exsited(normal_srv, (deps+i)->match, total_normal))
    			{
    				//printf("%s(%d)\n", __func__, __LINE__);
    				strcpy(normal_srv[total_normal], (deps+i)->match);
    				total_normal++;
    			}
    		}
    	}
    	//printf("%d\n", total_normal);
    
    	bubble_sort(normal_srv, total_normal);
    
    	for (i = 0; i < total_normal; i++)
    	{
    		if (i != total_normal-1)
    		{
    			printf("%s,", normal_srv[i]);
    		}
    		else
    		{
    			printf("%s\n", normal_srv[i]);
    		}
    	}
        return 0;
    }
    
    

    测试用例:
    一:
    a2-a1,a2-a3,a1-a2
    a2
    二:
    a1-a2,a5-a3,a1-a4,a6-a7,a9-a2,a5,a8-a3
    a3,a4
    三:
    a2-a1,a2-a3,a5-a100,a2399-a3,a450-a2,a3-a4,a500-a3,a1999-a222
    a2,a5,a3
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值