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 }
时间: 2024-11-09 03:56:33

uva247(floyd+dfs)的相关文章

UVa247 Calling Circles (Floyd,DFS)

链接:http://bak3.vjudge.net/problem/UVA-247 分析:先用Floyd求出有向图的传递闭包,然后用DFS求出各个联通分量即可. 1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 #include <string> 5 using namespace std; 6 7 vector<string> names; 8 int ID(const

9月刷题总结

全是usaco水题.... 贪心(这个要放在首位,思想太重要): [BZOJ]1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分+贪心) [BZOJ]1691: [Usaco2007 Dec]挑剔的美食家(multiset+贪心) [BZOJ]1692 & 1640: [Usaco2007 Dec]队列变换(后缀数组+贪心) [BZOJ]1620: [Usaco2008 Nov]Time Management 时间管理(贪心) [BZOJ]1634: [Usa

cogs5. P服务点设置

★★   输入文件:djsc.in   输出文件:djsc.out   简单对比 时间限制:2 s   内存限制:128 MB 问题描述 为了进一步普及九年义务教育,政府要在某乡镇建立P所希望小学,该乡镇共有n个村庄,村庄间的距离已知,请问学校建在哪P个村庄最好?(好坏的标准是学生就近入学,即在来上学的学生中,以最远的学生走的路程为标准.或者说最远的学生与学校的距离尽可能的小.) [输入格式] 输入由若干行组成,第一行有3个整数,n(1≤n≤100).m(1≤m≤n2),p:n表示村庄数,m表示

PAT甲级考前整理

终于在考前,刷完PAT甲级130道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种境界.PAT甲级题目总的说卡题目的比较多,卡测试点的比较少,有些题目还会有题意混淆,这点就不吐槽了吧.静下心来耍这130道题,其实磨练的是一种态度与手感,养成的是一种习惯.热爱AC没有错!! 130道题目主要的考点: 1.排序:快速排序,直接插入排序,希尔排序,分治排序,堆排序. 2.图论:拓扑排序.最短路径.深度搜索.广度搜索. 3.树:树的遍历.完全二叉树.AVL. 4.其他:并查集,模拟,哈希.背包.

UVA 247 电话圈 (floyd传递闭包 + dfs输出连通分量)

题意:输出所有的环: 思路:数据比较小,用三层循环的floyd传递闭包(即两条路通为1,不通为0,如果在一个环中,环中的所有点能互相连通),输出路径用dfs,递归还没有出现过的点(vis),输出并递归该点与其他点能互达的点: 1 #include <cstdio> 2 #include <vector> 3 #include <string> 4 #include <cstring> 5 #include <iostream> 6 using n

【转】POJ-2243-Knight Moves:DFS || BFS || Floyd 求最短路

DFS #include<iostream> #include<cstdio> #include<cstring> using namespace std; int knight[8][8];// 各点到起点的最短距离 int x[8]={-2, -1, 1, 2, -2, -1, 1, 2}; int y[8]={-1, -2, -2, -1, 1, 2, 2, 1}; void DFS(int i, int j, int dis) { if(i<0||i>

hdu 2544 最短路(Dijkstra Or Floyd Or dfs)

Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包

【UVA】247 - Calling Circles(floyd判断包闭,dfs输出)

最近状态不佳,总是爱犯低级错误,比较水的题,没什么需要讲得,要说的可能是floyd判断包闭吧 void Floyd() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) if(map[i][k]) for(int j=1; j<=n; j++) if(map[k][j]) map[i][j] = 1; } 之前做了不少图论,图论周感觉能应付的过去. 14059727 247 Calling Circles Accepted C++ 0.0

hdu 1874 畅通工程续 (Dijkstra or Floyd or Dfs)

Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰.现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束. 每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以0