[Uva247][Tarjan求强连通分量][Calling Circles]
题目大意:
例如: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]的更多相关文章
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- tarjan求强连通分量+缩点+割点以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- Tarjan求强连通分量,缩点,割点
Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题
Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- CCF 高速公路 tarjan求强连通分量
问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...
- UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】
Road Networks Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Stat ...
- tarjan求强连通分量(模板)
https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...
- Tarjan求强连通分量、求桥和割点模板
Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...
随机推荐
- Swift学习之函数和简单地控件的创建
今天还是重复昨天做的事情--敲代码,但唯一的不同就是所学的知识不同了,我们又进一步往深得层次学习了,感觉越来越有意思了,虽然临近结束了看着大家积极性越来越低了,但是我知道我不能这样,我要比别人付出的 ...
- 1.jdk、Tomcat、solr的安装和配置
1.jdk安装和配置 1)根据电脑类型,到官网下载相应的jdk版本 2)双击jdk-8u5-windows-x64.exe安装包,一直点下一步就可以了,注意记住jdk和jre的安装目录. 3)环境变量 ...
- C学习笔记 - 指针
指针与数组 ,,,,}; int *p; p = a; printf("*a = %d\n",*a); printf("*p = %d\n",*p); prin ...
- IOS 实现QQ好友分组展开关闭功能
贴出核心代码 主要讲一下思路. - (void)nameBtnClick:(myButton *)sender { //获取当前点击的分组对应的section self.clickIndex = s ...
- Linux 入门命令
本文系转载:http://www.cnblogs.com/wwj9413/archive/2012/03/15/2638638.html#2929949 1.Linux进入与退出系统 进入Linux系 ...
- slave延迟原因及优化方法
转载叶总:http://imysql.com/2015/04/12/mysql-optimization-case-howto-resolve-slave-delay.shtml 一般而言,slave ...
- Fedora19/18/17安装显卡驱动和无限网卡驱动
一.安装nvidia显卡驱动 1. 切换到root用户 su - 2. 确定当前Linux内核及SELinux policy 是否为最新 yum update ke ...
- MAC OS中使用ll,la命令
在linux下习惯了使用ll.la等ls别名 用mac os发现没有这样的命令,很不方便. 其实只要在用户目录下建立一个脚本“.bash_profile”,并输入以下内容即可:alias ll='ls ...
- php过滤iphone的emoji表情
public static function removeEmoji($text) { $clean_text = ""; // Match Emoticons $regexEmo ...
- python运维开发(十九)----Django后台表单验证、session、cookie、model操作
内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...