东大oj-1591 Circle of friends
题目描述
Nowadays, "Circle of Friends" is a very popular social networking platform in WeChat. We can share our life to friends through it or get other's situation.
Similarly, in real life, there is also a circle of friends, friends would often get together communicating and playing to maintain friendship. And when you have difficulties, friends will generally come to help and ask nothing for return.
However, the friendship above is true friend relationship while sometimes you may regard someone as your friend but he doesn't agree.In this way when you ask him for help, he often asks you for a meal, and then he will help you.
If two people think they are friends mutually,they will become true friend,then once one of them has a problem or makes a query, the other one will offer help for free.What's more,if one relationship is similar to “A regards B as friend, B regards C as friend
and C regards A as friend”,they will make a friends circle and become true friends too with each other. Besides, people will not ask those who they don’t regard as friends for help. If one person received a question and he can not solve it, he will ask his
friends for help.
Now, Nias encounters a big problem, and he wants to look for Selina's help. Given the network of friends, please return the minimum number of meals Nias must offer. Of course Nias is lavish enough, so he will pay for all the meals in the network of friends.
输入
The first line of input contains an integer T, indicating the number of test cases (T<=30).
For each test case, the first line contains two integers, N and M represent the number of friends in the Nias’s network and the number of relationships in that network. N and M are less than 100000 and you can assume that 0 is Nias and n-1 is Selina.
Next M lines each contains two integers A and B, represent a relationship that A regards B as his friend, A and B are between 0 and n-1.
输出
For each test case, please output the minimum number of meals Nias need to offer; if Nias can’t get Selina’s help, please output -1.
样例输入
3 4 4 0 1 1 2 2 1 2 3 3 3 0 1 1 2 2 1 3 1 0 1
样例输出
2 1 -1
题解
首先,深度优先求有向图强连通分量(Tarjan)算法
其次,构图,所构造出来的新图是一个拓扑图
最后,spfa求最短路径.
知识点:
spfa适用于稀疏图最短路径,dijstra适合稠密图最短路.
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 7;
int N, M;
struct Edge{
int to, next;
}e[maxn*2];
int ei,g[maxn];
void push_back(int f, int t){
e[++ei].to = t;
e[ei].next = g[f];
g[f] = ei;
}
int ti, pre[maxn], low[maxn],num[maxn],sccNo;
int a[maxn];
struct Stack{
int a[maxn];
int i;
void init(){ i = 0; }
void push(int x){a[i++] = x;}
int pop(){return a[--i];}
}sta;
void dfs(int now){
pre[now] = low[now] = ++ti;
sta.push(now);
for (int i = g[now]; i; i = e[i].next){
int t = e[i].to;
if (pre[t] == 0)dfs(t), low[now] = min(low[now], low[t]);
else if (num[t] == 0)low[now] = min(low[now], pre[t]);
}
if (pre[now] == low[now]){
++sccNo;
while (true){
int x = sta.pop();
num[x] = sccNo;
if (x == now)break;
}
}
}
void newGraph(){
memset(a, 0, sizeof(int)*(1+sccNo));
for (int i = 0; i < N; i++){
for (int j = g[i]; j; j = e[j].next){
int t = e[j].to;
if (num[i] ^ num[t]){
e[++ei].next = a[num[i]];
e[ei].to = num[t];
a[num[i]] = ei;
}
}
}
}
struct Q{
int a[maxn], head, rear;
bool has[maxn];
void init(){ head = rear = 0; memset(has, 0, sizeof(int)*(sccNo+1)); }
void enq(int x){ a[rear] = x; rear = (rear + 1) % maxn; has[x] = 1; }
int deq(){ int ans = a[head]; head = (head + 1) % maxn; has[ans] = 0; return ans; }
}q;
int dis[maxn];
void spfa(){
q.init();
q.enq(num[0]);
memset(dis, 0x34, sizeof(int)*(1 + sccNo));
dis[num[0]] = 0;
while (q.head^q.rear){
int now = q.deq();
for (int i = a[now]; i; i = e[i].next){
int t = e[i].to;
if (dis[t] > dis[now] + 1){
dis[t] = dis[now] + 1;
if (q.has[t]== false){
q.enq(t);
}
}
}
}
if (dis[num[N - 1]] == 0x34343434)printf("-1\n");
else printf("%d\n", dis[num[N - 1]]);
}
int main(){
freopen("in.txt", "r", stdin);
int T; scanf("%d", &T);
while (T--){
scanf("%d%d", &N, &M);
ei = 0, memset(g, 0, sizeof(int)*N);
while (M--){
int x, y; scanf("%d%d", &x, &y);
push_back(x, y);
}
ti = 0, memset(pre, 0, sizeof(int)*N), memset(num, 0, sizeof(int)*N);
sta.init(), sccNo = 0;
for (int i = 0; i < N; i++)if (pre[i] == 0)dfs(i);
newGraph();
spfa();
}
return 0;
}
东大oj-1591 Circle of friends的更多相关文章
- 东大OJ 2SAT 异或
看了十年才懂懂了十年才会会了十年才会写写了十年才写完写完了十年才能改对 #include<stdio.h> #include<string.h> struct res{ int ...
- 东大OJ-Max Area
1034: Max Area 时间限制: 1 Sec 内存限制: 128 MB 提交: 40 解决: 6 [提交][状态][讨论版] 题目描述 又是这道题,请不要惊讶,也许你已经见过了,那就请你再 ...
- 西南民大oj(两园交求面积)
西南民大oj:http://www.swunacm.com/acmhome/welcome.do?method=index 我的几何不可能那么可爱 时间限制(普通/Java) : 1000 MS/ 3 ...
- Online Judge(OJ)搭建(第一版)
搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...
- [翻译svg教程]svg中的circle元素
svg中的<circle> 元素,是用来绘制圆形的,例如 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink= ...
- [C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ
前言 做过杭电.浙大或是北大等ACM题库的人一定对“刷题”不陌生,以杭电OJ为例:首先打开首页(http://acm.hdu.edu.cn/),然后登陆,接着找到“Online Exercise”下的 ...
- oj Rapid Typing
import bs4 import requests import urllib2 import time import base64 session=requests.Session() respo ...
- 在线OJ实用技巧(转载)
1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long long或__int64型(两个下 ...
- 设计一个程序,程序中有三个类,Triangle,Lader,Circle。
//此程序写出三个类,triangle,lader,circle:其中triangle类具有类型为double的a,b,c边以及周长,面积属性, //具有周长,面积以及修改三边的功能,还有判断能否构成 ...
随机推荐
- 学会使用简单的 MySQL 常用操作
一.MySQL 数据库的基本安装 # yum 安装 mysql 版本:5.1.73 [root@mysql ~]# yum install -y mysql-server mysql # 启动 MyS ...
- emacs 新手笔记(四) —— 使用 dired 完成一些简单的文件和目录操作
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 据说熟悉了 dired,就可以在 emacs 下轻松管理文件和目录了,甚至不再需要 shell 和桌面操作. ...
- LNMP环境搭建
LNMP环境搭建 Linux + Nginx + MySQL + PHP PHP是一种脚本语言,当前中国乃至世界上使用PHP语言开发的网站非常普遍 Nginx是一个web服务软件,和apache是一类 ...
- SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)(转)
使用 SSM ( Spring . SpringMVC 和 Mybatis )已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没 ...
- Codeforces Round #371 (Div. 2) C. Sonya and Queries[Map|二进制]
C. Sonya and Queries time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 烈焰SWF解密
SWF 解密 是用UE编辑器 改 SWF开头 的AA AA AA ,改成43 57 53 就解密了
- curl 工具收集
注意:curl 目标地址不能使用 0.0.0.0: port, 这样会curl返回结果显示不正常: 实际上有返回,但是curl提示没有数据.
- vijos1037搭建双塔(一维背包问题)
描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块 ...
- HTML5网站如何做到完全不需要jQuery
jQuery是现在最流行的JavaScript工具库. 据统计,目前全世界57.3%的网站使用它.也就是说,10个网站里面,有6个使用jQuery.如果只考察使用工具库的网站,这个比例就会上升到惊人的 ...
- crontab日常使用梳理
在日常的运维工作中,对crontab定时任务的制定是再寻常不过的了.根据以往的使用经验梳理如下: 基本格式 :* * * * * command分 时 日 月 周 命令解释:第1列表示分钟1-59 每 ...