acm-UVA247解题报告

来源:互联网 发布:女士马丁靴品牌知乎 编辑:程序博客网 时间:2024/06/05 07:11

题目大意: 电话圈组成,回路判断问题
解题思路: 转化字符串以后,用五行Floyd判断包闭
代码:

#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<iostream>using namespace std;#define maxn 50int map[maxn][maxn],n,m;int vis[maxn];char name[maxn][50];int charge(char *s){    int i;    for(i=0;i<m;i++)        if(strcmp(name[i],s)==0)return i;    if(i==m)    {        strcpy(name[m],s);m++;        return m-1;    }}void dfs(int u){    vis[u]=1;    for(int i=0;i<n;i++)        if(map[u][i]==1&&map[u][i]==map[i][u])        {         if(vis[i]==0)         {            cout<<", "<<name[i];            dfs(i);         }    }}int main(){    int Case=1;int bian;    while(~scanf("%d%d",&n,&bian)&&n!=0&&bian!=0)    {        memset(map,0,sizeof(map));        memset(vis,0,sizeof(vis));        char start[50],finish[50],str1[50],str2[50];        cin>>start>>finish;        strcpy(name[0],start);strcpy(name[1],finish);m=2;        map[0][1]=1;        int x,y;        for(int i=0;i<bian-1;i++)        {            cin>>str1>>str2;            x=charge(str1);y=charge(str2);            map[x][y]=1;        }        for(int k=0;k<n;k++)            for(int i=0;i<n;i++)                for(int j=0;j<n;j++)                    if(map[k][j]==1&&map[i][k]==1)map[i][j]=1;/*        for(int i=0;i<10;i++)        {            for(int j=0;j<10;j++)            {                cout<<map[i][j]<<" ";            }            cout<<endl;        }*/        cout<<endl;        cout<<"Calling circles for data set "<<Case<<":"<<endl;        Case++;        for(int i=0;i<n;i++)        {            if(vis[i]==0)            {                cout<<name[i];                dfs(i);                cout<<endl;            }        }    }    return 0;}
0 0
原创粉丝点击