有些题还得练练模拟的能力呀

这题一言难尽,他给的 图不是半连通子图呀,我崩溃了

要分好组,然后1给2连,2给3连,。。。。。n给1连。。

具体看代码,我写的比较捞了吧。。

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn = 2e5 + 7;
vector<int>G[maxn], G2[maxn]; void insert(int be, int en) {
G[be].push_back(en);
}
stack<int>s;
int in[maxn];
int out[maxn];
int n;
int dfn[maxn], low[maxn], clor[maxn], ins[maxn], ans, df; int tarjan(int x) {
s.push(x);
dfn[x] = low[x] = ++df;
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i];
if (!dfn[p]) {
tarjan(p);
low[x] = min(low[x], low[p]);
}
else if (!clor[p]) {
low[x] = min(low[x], dfn[p]);
}
}
if (dfn[x] == low[x]) {
ans++;
while (1) {
int a = s.top();
s.pop();
clor[a] = ans;
ins[ans] = a;
if (a == x) break;
}
}
return 0;
}
int find() {
for (int i = 1; i <= n; i++) {
if (!dfn[i]) {
tarjan(i);
}
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < G[i].size(); j++) {
int be = clor[i];
int en = clor[G[i][j]];
if (be != en) {
in[en]++;
out[be]++;//出
G2[be].push_back(en);
}
}
}
for (int i = 1; i <= n; i++) {
G[i].clear();
}
return 0;
}
int vis[maxn]; int dfs(int x) {
for (int i = 0; i < G2[x].size(); i++) {
int p = G2[x][i];
dfs(p);
vis[x] = vis[p];
}
return 0;
}
int list[maxn];
vector<int>cns;
int main() { scanf("%d", &n);
int x;
int y;
for (int i = 1; i <= n ; i++) {
scanf("%d", &x);
G[i].push_back(x); }
find();
if (ans == 1) {
printf("0\n");
return 0;
}
n = ans;
int c = 0;
for (int i = 1; i <= n; i++) {
if (out[i] == 0) {
vis[i] = ++c;
list[c] = i;
}
}
for (int i = 1; i <= n; i++) {
if (in[i] == 0) {
dfs(i);
}
} for (int i = 1; i <= n; i++) {
if (in[i] == 0) {
G[vis[i]].push_back(i);
}
}
for (int i = 1; i < c; i++) {
//list[i]--->G[i+1]
for (int j = 0; j < G[i + 1].size(); j++) {
cns.push_back(list[i]);
cns.push_back(G[i + 1][j]);
}
}
for (int i = 0; i < G[1].size(); i++) {
cns.push_back(list[c]);
cns.push_back(G[1][i]);
}
printf("%d\n", cns.size() / 2);
for (int i = 0; i < cns.size(); i+=2) {
printf("%d %d\n", ins[cns[i]], ins[cns[i + 1]]);
}
return 0;
}

  

codefoces 22E 图论的更多相关文章

  1. Codeforces 22E(图论)

    题意: 给出n个节点,以及和这个节点指向的节点fi,表示从i能够到达fi,问至少需要添加多少条边能够使得原图变为强连通分量, 输出边数及添加的边,多解输出任意一组解. 2 <= n <= ...

  2. [leetcode] 题型整理之图论

    图论的常见题目有两类,一类是求两点间最短距离,另一类是拓扑排序,两种写起来都很烦. 求最短路径: 127. Word Ladder Given two words (beginWord and end ...

  3. 并查集(图论) LA 3644 X-Plosives

    题目传送门 题意:训练指南P191 分析:本题特殊,n个物品,n种元素则会爆炸,可以转移到图论里的n个点,连一条边表示u,v元素放在一起,如果不出现环,一定是n点,n-1条边,所以如果两个元素在同一个 ...

  4. NOIp 2014 #2 联合权值 Label:图论 !!!未AC

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  5. HDU 5521 [图论][最短路][建图灵感]

    /* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...

  6. SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  7. [转] POJ图论入门

    最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...

  8. HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. Codeforces 553C Love Triangles(图论)

    Solution: 比较好的图论的题. 要做这一题,首先要分析love关系和hate关系中,love关系具有传递性.更关键的一点,hate关系是不能成奇环的. 看到没有奇环很自然想到二分图的特性. 那 ...

随机推荐

  1. ssh scp nc

    ssh远程连接 ssh root@192.168.111.11 scp数据传输,(secure copy) 1.下载.拉取 scp root@192.168.111.11:/root/database ...

  2. mybatis多排序问题

    在很多业务场景中,会有多排序问题,mybatis支持多排序,写法如下: ORDER BY contract.contractCount DESC, reward.rewardTotal DESC, n ...

  3. laravel 踩坑 env,config

    正常情况: env 方法 可以获取 .env 文件的值 config 可以获取 config 文件夹下 指定配置的值 非正常情况: 当我们执行了 php artisan config:cache 之后 ...

  4. python小数据池 is和 == 再谈编码

    1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 2. is和==的区别 is 比较的是内存地址 == ...

  5. js280行代码写2048

    2048 原作者就是用Js写的,一直想尝试.但久久未动手. 昨天教学生学习JS代码.最好还是就做个有趣的游戏好了.2048这么火,是一个不错的选择. 思路: 1. 数组 ,2维数组4x4 2. 移动算 ...

  6. HZOJ 随

    这个题的题解并不想写……一个写的很详细的blog 第1个测试点:mod=2,a[i]<mod(仔细看题),则n个数字都是1,直接输出1即可. 第2个测试点:每次乘上去的数字只有一种选择,快速幂即 ...

  7. 如何用phpmyadmin导入大容量.sql文件,直接使用cmd命令进行导入

    很多使用php+mysql建站的站长朋友们,经常要用到phpMyAdmin数据库管理工具备份和恢复数据库,当站点运行很久的时候,MySQL数据库会非常大,当站点碰到问题时,需要使用phpMyAdmin ...

  8. codedecision P1112 区间连续段 题解 线段树

    题目描述:https://www.cnblogs.com/problems/p/P1112.html 题目链接:http://codedecision.com/problem/1112 线段树区间操作 ...

  9. HDU 1271

    这题做了好久..... 理解别人的代码都理解了好久!!!太弱太弱. #include<iostream> #include<algorithm> #include<cma ...

  10. maven环境隔离

    pom <build>节点下增加节点 <resources> <resource> <directory> src/main/resources.${d ...