uva 10044 Erdös Numbers

来源:互联网 发布:台湾生活 知乎 编辑:程序博客网 时间:2024/06/06 06:49
题意:有一个数学家名字是Erdos P. 与他一起发表过论文的人的Erdös Number 是 1 与Erdös Number是1的人发表过论文的是2 依次类推  木有Erdös Number数的输出
infinity
注意测试数据很强也很大
连接点击打开链接
#include <stdio.h>#include <string.h>#define MAX 0x3fffffff#define Max 5000struct list{char name[1000];int num;}s[Max];bool visit[Max][Max];void initialize ( ){int i, j;for ( i = 0; i < Max; i++ )for ( j = 0; j < Max; j++ )visit[i][j] = false;strcpy ( s[0].name, "Erdos, P." );s[0].num = 0;for ( i = 1; i < Max; i++ )s[i].num = MAX;}void solve ( int n, int m ){int sum = 1, i, j, k;char str[100000];initialize ( );for ( i = 0; i < n; i++ ){gets ( str );char ch[1000];bool flag[Max] = { false };int x = 0, len = strlen ( str );for ( j = 0; j < len; j++ ){if ( x != 0 || str[j] != ' ' )ch[x++] = str[j];if ( ( j - 1 > 0 && str[j] == ',' && str[j-1] == '.' ) || str[j] == ':' ){x--;ch[x] = '\0';bool find = false;for ( k = 0; k < sum; k++ )if ( !strcmp ( ch, s[k].name ) ){find = true;x = k;break;}if ( !find ){strcpy ( s[sum].name, ch );x = sum;sum++;}flag[x] = true;x = 0;if ( str[j] == ':' )break;}}for ( j = 0; j < sum; j++ )if ( flag[j] )for ( k = 0; k < sum; k++ )if ( flag[k] && k != j )visit[j][k] = true;}for ( i = 0; i < sum; i++ )for ( j = 0; j < sum; j++ )if ( s[j].num == i ){for ( k = 0; k < sum; k++ )if ( visit[j][k] ){if ( s[k].num > i + 1 )s[k].num = i + 1;}}for ( i = 0; i < m; i++ ){gets ( str );for ( j = 0; j < sum; j++ )if ( !strcmp ( str, s[j].name ) )break;printf ( "%s ", str );if ( s[j].num == MAX )puts ( "infinity" );elseprintf ( "%d\n", s[j].num );}}int main ( ){int n, m, t;scanf ( "%d", &t );for ( int i = 1; i <= t; i++ ){printf ( "Scenario %d\n", i );scanf ( "%d%d\n", &n, &m );solve ( n, m );}return 0;}


原创粉丝点击