UVA 247 Calling Circles(Floyd算法传递闭包)

来源:互联网 发布:windows 安装程序 编辑:程序博客网 时间:2024/06/07 17:38

题意:

两两给出名字,形成一组单向关系,输入所有关系后,输出在同一连通分量的所有名字。

解题思路:

首先利用map将名字映射为数字,然后利用Floyd算法传递闭包,最后使用dfs输出即可。


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


Memory: 0 KB Time: 23 MSLanguage: C++11 4.8.2 Result: Accepted

#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<cctype>#include<list>#include<iostream>#include<map>#include<queue>#include<set>#include<stack>#include<vector>using namespace std;#define FOR(i, s, t) for(int i = (s) ; i <= (t) ; ++i)#define REP(i, n) for(int i = 0 ; i < (n) ; ++i)int buf[10];inline long long read(){    long long x=0,f=1;    char ch=getchar();    while(ch<'0'||ch>'9')    {        if(ch=='-')f=-1;        ch=getchar();    }    while(ch>='0'&&ch<='9')    {        x=x*10+ch-'0';        ch=getchar();    }    return x*f;}inline void writenum(int i){    int p = 0;    if(i == 0) p++;    else while(i)        {            buf[p++] = i % 10;            i /= 10;        }    for(int j = p - 1 ; j >= 0 ; --j) putchar('0' + buf[j]);}/**************************************************************/#define MAX_N 30const int INF = 0x3f3f3f3f;map<string, int> mp;vector<string> name;int g[MAX_N][MAX_N];int vis[MAX_N];int n;void dfs(int s){    vis[s] = 1;    for(int i = 0 ; i < n ; i++)    {        if(g[s][i] && g[i][s] && !vis[i])        {            cout<<", "<<name[i];            dfs(i);        }    }}int main(){    int cas = 1;    while(~scanf("%d", &n) && n)    {        int cnt = 0;        mp.clear();        name.clear();        memset(g, 0, sizeof(g));        memset(vis, 0, sizeof(vis));        int m = read();        for(int i = 0 ; i < m ; i++)        {            string a, b;            cin >> a >> b;            if(!mp.count(a))            {                mp[a] = cnt++;                name.push_back(a);            }            if(!mp.count(b))            {                mp[b] = cnt++;                name.push_back(b);            }            int x = mp[a];            int y = mp[b];            g[x][y] = 1;        }        for(int k = 0 ; k < n ; k++)            for(int i = 0 ; i < n ; i++)                for(int j = 0 ; j < n ; j++)                    g[i][j] = (g[i][j] || (g[i][k] && g[k][j]));        if(cas != 1) cout<<endl;        printf("Calling circles for data set %d:\n", cas++);        for(int i = 0 ; i < n ; i++)        {            if(!vis[i])            {                cout<<name[i];                dfs(i);                cout<<endl;            }        }    }    return 0;}


0 0
原创粉丝点击