图论模板集合

1.拓扑排序

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
#define maxn 105
typedef long long ll;
vector<int> G[maxn];
struct node{
    int time;
    int id;
    bool operator < (const node & rhs)const{
        return time > rhs.time;
    }
}nodes[maxn];
int n;
bool vis[maxn];
int nowTime = 0;
void dfs(int u){
    nowTime ++;
    vis[u] = true;
    for(int i = 0;i < G[u].size();i ++){
        int v = G[u][i];
        if(!vis[v]) dfs(v);
    }
    nowTime ++;s
    nodes[u].time = nowTime;
}
void top(void){
    for(int i = 1;i <= n;i ++){
        if(!vis[i]){
            dfs(i);
        }
    }
}

int main(void){

    cin >> n;
    memset(vis,false,sizeof(vis));
    for(int i = 1;i <= n;i ++){
        int b;
        nodes[i].id = i;
        while(cin >> b && b != 0){
            G[i].push_back(b);
        }
    }
    nowTime = 0;
    top();
    sort(nodes+1,nodes+n+1);
    for(int i = 1;i <= n;i ++){
        cout <<  nodes[i].id << " ";               //按拓扑排序输出节点
    }
    cout << endl;
    return 0;
} 

2.无向图割点

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define maxn 100005
using namespace std;
vector<int> G[maxn];
int dfn[maxn],vis[maxn],low[maxn];
bool isGedian[maxn];                  //标记该点是否是割点
int fa[maxn];                         //父亲节点
int depth;
int root;
int ans;
void init(){
    memset(isGedian,0,sizeof(isGedian));
    memset(fa,0,sizeof(fa));
    memset(vis,0,sizeof(vis));
    for(int i = 0;i < maxn;i ++){
        G[i].clear();
    }
}
void dfs(int cur,int depth){
     int cnt = 0;                       //记录当前节点的孩子个数
     low[cur] = dfn[cur] = depth;
     vis[cur] = true;
     for(int i = 0;i < G[cur].size();i ++){
         int v = G[cur][i];
        if(!vis[v] && v != fa[cur]){
            fa[v] = cur;
            dfs(v,depth+1);
            cnt ++;
            low[cur] = min(low[cur],low[v]);
            if(low[v] >= dfn[cur] && root!= cur){
                if(!isGedian[cur]){
                    ans ++;
                }
                isGedian[cur] = true;
            }
        }
        else{
            low[cur] = min(low[cur],dfn[v]);
        }
     }
     if(root == cur && cnt > 1){
        if(!isGedian[cur]){
            ans ++;
        }
        isGedian[cur] = true;
     }
}
int main()
{
    int n,a,b;
    while(cin >> n && n){
        ans = 0;
        init();
        while(cin >> a && a){
            while(getchar() != ‘\n‘)
            {
                cin >> b;
                G[a].push_back(b);
                G[b].push_back(a);
            }
        }
        root = 1;
        dfs(1,0);
        cout << ans << endl;
    }
    return 0;
}

3.强连通分量

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#define maxn 10005
using namespace std;
vector<int> G[maxn],Gt[maxn]; //Gt存放补图
vector<int> S;
int vis[maxn];
int sccno[maxn];              //每个节点所在强连通分量的序号
int scc_cnt;                  //强连通分量个数
int outdegree[maxn];          //连通分量的出度

void dfs1(int u){             //目的,按每个节点结束搜索的时间排序
    if(vis[u]) return;
    vis[u] = 1;
    for(int i = 0;i < G[u].size();i ++){
        int v = G[u][i];
        dfs1(v);
    }
    S.push_back(u);
}
void dfs2(int u){
    if(sccno[u])    return;
    sccno[u] = scc_cnt;
    for(int i = 0;i < Gt[u].size();i ++){
        int v = Gt[u][i];
        dfs2(v);
    }
}
void find_scc(int n){
    S.clear();
    scc_cnt = 0;
    memset(sccno,0,sizeof(sccno));
    memset(vis,0,sizeof(vis));
    memset(outdegree,0,sizeof(outdegree));
    for(int i = 1;i <= n;i ++){
        dfs1(i);
    }
    for(int i = n-1;i >= 0 ;i --){
        if(!sccno[S[i]]){
            scc_cnt ++;
            dfs2(S[i]);
        }
    }
}

时间: 2024-10-31 06:11:24

图论模板集合的相关文章

模板集合——持续更新中

首先   sro_Cydiater_orz   sro_姬树流_orz 两位开搞模板集合已久的大神 1.对拍 1 @echo off 2 set path=C:\MinGWStudio\MinGW\bin 3 g++ -o makedata.exe makedata.cpp 4 g++ -o right.exe right.cpp 5 g++ -o test.exe test.cpp 6 set path=C:\Windows\system32 7 :loop 8 makedata.exe 9

图论模板简单整理

唔,图论部分暂时就看到这里了,整理一下最近学的东西 //最短路 //dijkstra void dijkstra() { memset(vis,0,sizeof(vis)); for(int i = 1;i <= n;i++) { d[i] = -1; } d[n] = 1; for(int k = 1;k <= n;k++) { double maxv = -1; int x = n; for(int i = 1;i <= n;i++) if(!vis[i] && d[

图论模板

图论模板 LCA 离线 tarjan //可使用快读 #include <iostream> #include <cstdio> using namespace std; const int MAXN=500050; int po[MAXN],qs[MAXN],fa[MAXN],nume,numq,n,m,root,ans[MAXN]; bool f[MAXN]; struct edge{ int to,nxt; }e[2*MAXN]; struct ques{ int to,nx

图论模板——最大流及费用流模板

图论模板--最大流及费用流模板 最大流--SAP 时间复杂度:O(v^2*e) const int MAXN=1010;//点数的最大值 const int MAXM=1010;//边数的最大值 const int INF=0x3f3f3f3f; struct Node { int from,to,next; int cap; }edge[MAXM]; int tol; int head[MAXN]; int dep[MAXN]; int gap[MAXN];//gap[x]=y :说明残留网络

字符串题模板集合

后缀数组 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <vector> #include <limits> #include <set> #include <map> using namespace std; #define S

图论模板目录

最短路模板:http://www.cnblogs.com/geloutingyu/p/6511586.html 次短路模板:http://www.cnblogs.com/geloutingyu/p/6528406.html k短路模板: http://www.cnblogs.com/geloutingyu/p/6532945.html 最小生成树模板:http://www.cnblogs.com/geloutingyu/p/5988519.html 最小树形图模板:http://www.cnbl

国内大学毕业论文LaTeX模板集合

薛瑞尼的清华大学学位论文LaTeX模板http://sourceforge.net/projects/thuthesis/ 北大论文文档 LaTeX 模板 pkuthss v1.2 betahttp://bbs.pku.edu.cn/bbs/bbstcon.php?board=MathTools&threadid=11364449 刘本源的国防科学技术大学研究生学位论文LaTeX模板http://code.google.com/p/nudtpaper/ 南开大学学位论文LaTeX模板(孙文昌老师

17款免费的Bootstrap后台管理模板集合

Bootstrap是Twitter推出的一个用于前端开发的开源工具包.是目前最受欢迎的前端框架之一.下面为大家推荐17个免费的Bootstrap后台管理界面模板. 1. Admin Lite AdminLTE - 是一个完全响应式管理模板.基于Bootstrap3的框架.高度可定制的,易于使用.支持很多的屏幕分辨率适合从小型移动设备到大型台式机. 2. Dashboard Sidebar 这是一个管理后台模板,拥有控制面板或仪表板.这个模板有一个可折叠的工具栏菜单,并且有可以作为一个数据网格的表

免费的Bootstrap管理后台模板集合

Free Bootstrap Admin Templates for Designers 1. Admin Lite AdminLTE - 是一个完全响应式管理模板.基于Bootstrap3的框架.高度可定制的,易于使用.支持很多的屏幕分辨率适合从小型移动设备到大型台式机. 2. Dashboard Sidebar 这是一个管理后台模板,拥有控制面板或仪表板.这个模板有一个可折叠的工具栏菜单,并且有可以作为一个数据网格的表格. 3. DevOOPS DevOOPS是一个自适应免费管理仪表板主题,