UVa(247),Floyd做传递闭包

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=183

紫书365页,用Floyd做传递闭包,然后深搜,其实可以不用找前驱,没有一定的顺序,爆搜一边就可以了。

然后是名字的导入,用vector处理就很好了。没有找到,就加到后面。

freopen没有注释掉,WA得我想哭。

names没清空,RE得想死。

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <vector>

using namespace std;

int dist[100][100];
bool vis[100];

int n,m;

vector<string> names;

int getId(const string &s)
{
    for(int i=0; i<names.size(); i++)
        if(names[i]==s) return i;
    names.push_back(s);
    return names.size()-1;
}

void dfs(int u)
{
    vis[u] = 1;
    for(int v=0; v<n; v++)
        if(!vis[v]&&dist[u][v]&&dist[v][u])
        {
            printf(", %s", names[v].c_str());
            dfs(v);
        }
}

int main()
{
    char s1[99], s2[99];
    int cases = 0;
    //freopen("input.txt","r",stdin);
    while(scanf("%d%d",&n,&m),n)
    {
        names.clear();
        memset(dist,0,sizeof(dist));
        for(int i=0; i<n; i++)
            dist[i][i] = 1;
        for(int i=0; i<m; i++)
        {
            scanf("%s%s", s1, s2);
            dist[getId(s1)][getId(s2)] = 1;
        }

        for(int k=0; k<n; k++)
            for(int i=0; i<n; i++)
                for(int j=0; j<n; j++)
                    dist[i][j] = dist[i][j]||(dist[i][k]&&dist[k][j]);

        if(cases > 0) printf("
");
        printf("Calling circles for data set %d:
", ++cases);

        memset(vis, 0, sizeof(vis));
        for(int i = 0; i < n; i++)
            if(!vis[i])
            {
                printf("%s", names[i].c_str());
                dfs(i);
                printf("
");
            }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5788079.html