中国海洋大学第四届朗讯杯高级组 Super Phyllis

原创 2013年12月02日 16:10:47

Super Phyllis

Time Limit: 1000MS    Memory limit: 65536K

题目描述

Phyllis works for a large, multi-national corporation. She moves from department to department where her job is to uncover and remove any redundancies inherent in the day-to-day activities of the workers. And she is quite good at her job.

During her most recent assignment, she was given the following chart displaying the chain of commandwithin the department:
                       

Whenever anyone needs to send a report to their bosses, they use the above chart, sending one report along each arrow. Phyllis realized almost instantly that there were redundancies here. Specifically, since D sends a report to B and B sends a report to A, there\'s really no need for D to send a report to A directly, since it will be summarized in the report B sends to A. Thus the connection from D to A can be removed. If there had also been a connection from C to B, then the connections from D to B and C to A could have been removed as well.

Phyllis would like your help with this. Given a description of a chart like the one above, she would like a program that identifies all connections that can be removed from the chart.

输入

The first line of each test case will contain a positive integer m indicating the number of connections in the chart. Following that will be m lines each containing two strings s1 s2 indicating that there is a connection from employee s1 to his/her boss s2. In any test case there will be no more than 200 employees listed and no connection will appear more than once. A line containing a single 0 will terminate the input.

输出

For each test case, output the number of connections that should be removed followed by a list of the deleted connections in lexicographic order. Connection s1 s2 should be represented by the string s1,s2.

示例输入

5
D B
D C
D A
B A
C A
6
D B
D C
D A
C B
B A
C A
1
Danny Tessa
0

示例输出

Case 1: 1 D,A
Case 2: 3 C,A D,A D,B
Case 3: 0

提示

来源

中国海洋大学第四届朗讯杯高级组

 

 

因为数组开小一直疯狂的RE,我还一直以为是queue出了问题,在SDUT的的OJ上丧心病狂的提交了20多遍最后换成vector才过掉。

首先这个题是不存在环的。

对每个点进行bfs。开始的点层数设为1,依层拓展,如果除了第一层之外的某层拓展到第二层的点,也就是说某个点连接着第二层的点,则说明从出发点(第一层的点)到这个第二层的点之间的边可以删掉。对所有点bfs就可以得到所有多余的边。

 

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <string>
#include <map>
#define MAXN 205
using namespace std;
map<string,int> mp1;
map<int,string> mp2;
bool gl[MAXN][MAXN];
int n,cnt;
int d[MAXN];
string ans[20000];
void bfs(int v)
{
    memset(d,0,sizeof(d));
    queue<int> que;
    que.push(v);
    d[v]=1;
    while(!que.empty())
    {
        int tmp=que.front();
        que.pop();
        for(int i=1; i<=n; ++i)
            if(gl[tmp][i])
            {
                if(!d[i])
                {
                    d[i]=d[tmp]+1;
                    que.push(i);
                }
                else
                {
                    if(d[i]==2&&gl[v][i])
                    {
                        string str=mp2[v]+","+mp2[i];
                        ans[cnt].clear();
                        ans[cnt++]=str;
                        gl[v][i]=false;
                    }
                }
            }
    }
}
int main()
{
    int m,kase=0;
    while(cin>>m&&m)
    {
        string a,b;
        memset(gl,0,sizeof(gl));
        mp1.clear();
        mp2.clear();
        n=0;
        for(int i=0; i<m; ++i)
        {
            cin>>a>>b;
            if(!mp1[a])
            {
                ++n;
                mp1[a]=n;
                mp2[n]=a;
            }
            if(!mp1[b])
            {
                ++n;
                mp1[b]=n;
                mp2[n]=b;
            }
            gl[mp1[a]][mp1[b]]=true;
        }
        cnt=0;
        for(int i=1; i<=n; ++i)
            bfs(i);
        sort(ans,ans+cnt);
        cout<<"Case "<<++kase<<": "<<cnt;
        for(int i=0; i<cnt; ++i)
            cout<<" "<<ans[i];
        cout<<endl;
    }
    return 0;
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

第一门慕课计划——在广东海洋大学推广MOOC学习

题记:这个计划是参加果壳网的“万有青年养成计划”,原帖网址请点击链接。同时希望【3天征集50条建议100个支持】,如果您对这个计划感兴趣,请花一分钟(1)点击“第一门慕课计划——在广东海洋大学推广MO...

广东海洋大学 电子1151 孔yanfei python语言程序设计 第七周

在python中,数据访问模型分为三种,直接存取,序列和映射 对于非容器类的数据类型,都属于直接存取访问;序列的典型代表:tuple, list, string, unicode string, b...

广东海洋大学 电子1151 孔yanfei python语言程序设计 第九周

机器学习算法与Python实践这个系列主要是参考《机器学习实战》这本书。因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法。恰好...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)