uva247(floyd+dfs)

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva247(floyd+dfs)相关的知识,希望对你有一定的参考价值。

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

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<map>
 5 #include<string>
 6 #include<iostream>
 7 using namespace std;
 8 const int maxn=30;
 9 map<string,int> namecode;
10 string codename[maxn];
11 int p[maxn][maxn];
12 int vis[maxn];
13 int n,m;
14 void floyd()
15 {
16     for(int k=1;k<=n;k++)
17         for(int i=1;i<=n;i++)
18         if(p[i][k]) for(int j=1;j<=n;j++)
19          if(p[k][j]) p[i][j]=1;  
20 }
21 
22 void dfs(int u)
23 {
24     vis[u]=1;
25     for(int i=1;i<=n;i++)
26     if(!vis[i]&&p[u][i]&&p[i][u])
27         {
28         cout<<", "<<codename[i];
29         dfs(i);
30         }
31 }
32 int main()
33 {
34 
35    int cas=0;
36    string a,b;
37    while(scanf("%d%d",&n,&m)&&(n||m))
38    {
39        memset(p,0,sizeof(p));
40        memset(vis,0,sizeof(vis));
41        namecode.clear();
42        int id=0;
43        while(m--)
44        {
45            cin>>a>>b;
46            if(!namecode.count(a)) { namecode[a]=++id;codename[id]=a;  }
47            if(!namecode.count(b)) { namecode[b]=++id;codename[id]=b;  }
48            int u=namecode[a];
49            int v=namecode[b];
50            p[u][v]=1;
51        }
52        if(cas>1)  puts("");
53        printf("Calling circles for data set %d:\n",++cas);
54        floyd();
55        for(int i=1;i<=n;i++) if(!vis[i])
56        {
57           cout<<codename[i];
58            dfs(i);
59            puts("");
60        }
61       
62    }
63 }

 

以上是关于uva247(floyd+dfs)的主要内容,如果未能解决你的问题,请参考以下文章

UVa 247 电话圈(Floyd传递闭包)

UVa 247 - Calling Circles(Floyd求有向图的传递闭包)

UVA - 10048 Audiophobia (Floyd应用)

World Finals 1996 Uva (Floyd求闭包)

uva 104 Arbitrage (DP + floyd)

UVa 10269 Adventure of Super Mario (Floyd + DP + BFS)