uva247

来源:互联网 发布:安徽宝德网络 编辑:程序博客网 时间:2024/06/07 05:27

题意:。
思路:入门经典365。

AC代码: 理解还不深刻。

#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>#include <vector>#include <string>#include <map>using namespace std;map<string,int>mp;vector<string>p(10001);int vis[50];int g[50][50];int d[50][50];void init(){    memset(vis,0,sizeof(vis));    memset(g,0,sizeof(g));    memset(d,0,sizeof(d));    mp.clear();    p.clear();}int n,m;void floyed(){    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]);            }        }    }}void dfs(int u){    vis[u]=1;    for(int i=0; i<n; i++){        if(!vis[i] && d[u][i] && d[i][u]){            cout << ", " << p[i];            dfs(i);        }    }    return ;}int main(){   // freopen("2.txt","r",stdin);    int c=0;    while(scanf("%d%d",&n,&m)!=EOF &&n &&m){        init();        string a,b;        int id=0;        for(int i=1; i<=m; i++){            cin>>a>>b;            if(!mp.count(a)) {mp[a]=id++; p.push_back(a);}            if(!mp.count(b)) {mp[b]=id++; p.push_back(b);}            g[mp[a]][mp[b]]=1;        }        if(c) printf("\n");        printf("Calling circles for data set %d:\n",++c);        floyed();        for(int i=0; i<n; i++){            for(int j=i+1; j<n; j++){                if(g[i][j] && g[j][i]) {                    d[i][j]=d[j][i]=1;                }            }        }        for(int i=0; i<n; i++){            if(!vis[i]){                cout << p[i];                dfs(i);cout << endl;            }        }    }    return 0;}
0 0