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

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

要分好组,然后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. AtCoder Grand Contest 019 B - Reverse and Compare【思维】

    AtCoder Grand Contest 019 B - Reverse and Compare 题意:给定字符串,可以选定任意i.j且i<=j(当然i==j时没啥卵用),然后翻转i到j的字符 ...

  2. python == 符号

  3. SDUT-2120_数据结构实验之链表五:单链表的拆分

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个整数顺序建立一个单链表,将该 ...

  4. 64位Linux编译C代码,crt1.o文件格式不对的问题

    今天在某台64位LInux下编译一个简单的hello world的C程序,报错: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../crt1.o: cou ...

  5. Python copy(), deepcopy()

    copy() 浅拷贝: 创建一组拷贝对象的引用.切片操作相当于浅拷贝,会生成一个新的对象,新的对象里保存原对象的引用. 如果原对象中的可变对象改变(list),那么浅拷贝的对象随之改变,如果原对象中不 ...

  6. Where是深复制

    从一个List中通过Where过滤出来的子List或Fist出来的单独元素,与原List是深复制关系.也就是说修改子list,或单独元素,并不会影响原List中的对象. 如:Geom g = Geom ...

  7. oracle函数 sys_guid()

    [功能]生产32位的随机数,不过中间包括一些大写的英文字母. [返回]长度为32位的字符串,包括0-9和大写A-F [示例] select sys_guid() from  dual

  8. iptables 累计(Accounting)

    对於每一条规则,核心各自设置两个专属的计数器,用于累计符合该条件的封包数,以及这些封包的总位元组数.这两项资讯可用於统计网路用量. 举例来說,假设有一台Internet闸道器路,eth0接内部网络,e ...

  9. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

  10. 使用模块定义AngularJS组件

    一.模块创建/查找 module 当创建一个模块时,必须指定name和requires参数,即使你的模块并不存在依赖 var myApp=angular.module("exampleApp ...