UVA247- Calling Circles

来源:互联网 发布:中国经济现状数据 编辑:程序博客网 时间:2024/05/29 17:02

利用map的特性进行编号,然后利用floyd求出传递闭包,最后又用到DFS进行输出,每一步都很重要。

#include<stdio.h>#include<map>#include<string>#include<iostream>#include<string.h>#include<vector>using namespace std;   int n,m,cas=1;map<string,int>name;int f[30][30];int vis[30];vector<string>Name;void dfs(int u){    vis[u]=1;    for(int i=0;i<n;i++)    if(f[u][i]&&f[i][u]){        if(!vis[i]){            cout<<", "<<Name[i];            dfs(i);        }    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        name.clear();        Name.clear();        memset(f,0,sizeof f);        memset(vis,0,sizeof vis);       // if(cas>1) puts("");        int id=0;        if(n==0&&m==0) break;        for(int i=0;i<m;i++){            string a,b;            cin>>a>>b;            if(!name.count(a))            {                name[a]=id++;                Name.push_back(a);            }            if(!name.count(b))            {                name[b]=id++;                Name.push_back(b);            }            int x=name[a],y=name[b];            f[x][y]=1;        }        for(int k=0;k<n;k++)            for(int i=0;i<n;i++)                for(int j=0;j<n;j++)                f[i][j]=(f[i][j]||(f[i][k]&&f[k][j]));        if(cas>1)            cout<<endl;        cout<<"Calling circles for data set " << cas++ <<":" << endl;        for(int i=0;i<n;i++){            if(!vis[i]){             cout<<Name[i];             dfs(i);             cout<<endl;            }        }    }    return 0;}


0 0
原创粉丝点击