题目大意:

例如:A跟B打电话,B跟C打电话,C跟A打电话..D跟E打电话,E跟D不打电话.则A,B,C属于同一个电话圈,D,E分别属于一个电话圈,问有多少个电话圈。

分析

就是裸的求强连通分量,直接用Tarjan解决

代码

#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
#include <stack>
using namespace std;
int N,M;
string NAME[40];
map<string,int> dict;
stack<int> S;
int tot=0; //这一道题特有的存点..
int cnt=0; //强连通数目
int TIME=0; //时间戳
int DFN[40],Low[40]; //DNF 时间戳,Low ,u及u的子树最小的时间戳
bool INSTACK[40]; //判断是否在栈内
int Belong[40]; //存储属于哪一个强连通分量;
struct Edge{
int to;
Edge *next;
}E[20000],*EE;
struct Node{
Edge *first;
}G[50];
void Link(int a,int b)
{
EE->to=b;EE->next=G[a].first;G[a].first=EE++;
}
void input()
{
EE=E;
tot=0;
TIME=0;
cnt=0;
string a,b;
dict.clear();
memset(G,0,sizeof(G));
memset(DFN,0,sizeof(DFN));
for(int i=1;i<=M;i++)
{
cin>>a>>b;
if(dict[a]==0)
{
dict[a]=++tot;
NAME[tot]=a;
}
if(dict[b]==0)
{
dict[b]=++tot;
NAME[tot]=b;
}
Link(dict[a],dict[b]);
}
}
void Tarjan(int u)
{
DFN[u]=Low[u]=++TIME;
S.push(u);
INSTACK[u]=true;
for(Edge *p=G[u].first;p;p=p->next)
{
if(DFN[p->to]==0)
{
Tarjan(p->to);
Low[u]=min(Low[u],Low[p->to]);
}
else if(INSTACK[p->to]==true)
Low[u]=min(Low[u],DFN[p->to]);
}
int k;
if(DFN[u]==Low[u])
{
int ok=0;
cnt++;
do
{
k=S.top();
S.pop();
INSTACK[k]=false;
Belong[k]=cnt;
if(ok==0)
{
ok=1;
cout<<NAME[k];
}
else cout<<", "<<NAME[k];
}while(k!=u);
cout<<endl;
}
}
void solve()
{
for(int i=1;i<=N;i++)
{
if(DFN[i]==0)
Tarjan(i);
}
}
int main()
{
int CASE=0;
// freopen("a.in","r",stdin);
while(cin>>N>>M&&(N||M))
{
printf("Calling circles for data set %d:\n",++CASE);
input();
solve();
}
}

[Uva247][Tarjan求强连通分量][Calling Circles]的更多相关文章

  1. UESTC 901 方老师抢银行 --Tarjan求强连通分量

    思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...

  2. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  3. Tarjan求强连通分量,缩点,割点

    Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...

  4. tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  5. HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. CCF 高速公路 tarjan求强连通分量

    问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...

  7. UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】

    Road Networks Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Stat ...

  8. tarjan求强连通分量(模板)

    https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...

  9. Tarjan求强连通分量、求桥和割点模板

    Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...

随机推荐

  1. CSDN 正整数异或值问题

    题目详情: http://student.csdn.net/mcs/programming_challenges?page=4 给你n个正整数,请你计算出有多少对数的异或值小于等于k. 输入描写叙述: ...

  2. 十一招解决:系统IE部分网页打不开怎么办(转载)

    网页打不开这问题,却实非常令人头痛,问过非常多人,都说不出真正的理由和解决方法.以下是在网络上面搜集的一些针对“网页打不开怎么办”解决方法,共十一条,希望可以对大家有帮助. Application M ...

  3. hdu 2822 Dogs(优先队列)

    题目链接:hdu2822 会优先队列话这题很容易AC.... #include<stdio.h> #include<string.h> #include<queue> ...

  4. DotDensityRenderer

    关键之处在于获取每个点所代表的的值 这里使用geodatabase类库中idatastatistic接口进行统计字段,再将结果传递给esrisysytem.istatisticsResult进行. 需 ...

  5. Android 加速Gradle构建项目

    1. 升级gradle 进入项目文件夹$project/gradle/wrapper/gradle-wrapper.properties, 使用最新的gradle. 修改替换为最新的 distribu ...

  6. Request获取url各种信息的方法

    1.Request获取url各种信息的方法 测试的url地址:http://www.test.com/testweb/default.aspx, 结果如下: Request.ApplicationPa ...

  7. 有向强连通分支Tarjan算法

    本文转载自:http://blog.csdn.net/xinghongduo/article/details/6195337 说到以Tarjan命名的算法,我们经常提到的有3个,其中就包括本文所介绍的 ...

  8. block中无法使用C数组变量

    在Objective-C的block中无法使用C数组,即使我们不对C数组做任何改变,编译的时候也会报错: #include <stdio.h> int main() { const cha ...

  9. 异常处理与调试6 - 零基础入门学习Delphi55(完)

    调试(Debug) 让编程改变世界 Change the world by program 使用调试窗口 为方便调式程序,Delphi中提供了许多调试窗口,给开发人员的调试工作带来了极大的便利. 断点 ...

  10. ASP.NET MVC 4.0 学习3-Model

    Model負責獲取數據庫中的資料,並對數據庫中的數據進行處理. MVC中有關 數據庫 的任務都由Model來完成,Model中對數據資料進行定義,Controller和View中都會參考到Model, ...