• luogu 图论刷题


    新年快乐啊!现在感觉原来过年就是找个理由不学习啊!!!!

    但是学习还得继续,,,呜呜呜,长期生活在舒适圈别走不出来

    p5318
    这个题其实考的就是图的遍历(废话),但是存点的时候可以用一个vector把每个点的下一个链接存起来

    邻接矩阵可能会爆内存!!!

    //
    //created by Arc on 2021/2/16
    //
    //p5318 of luogu
    #include<iostream>
    #include<vector>
    #include <queue>
    #include <algorithm>
    
    using namespace std;
    struct edge{
        int u;
        int v;
    };
    vector<int> e[100001];//与第i个点联系的点存在e[i]中
    vector<edge> s;
    bool cmp(edge a,edge b){
        if(a.u==b.u){
            return a.v<b.v;
        }
        return a.u<b.u;
    }
    bool vis1[100001]={0};
    bool vis2[100001]={0};
    void dfs(int x){
        if(vis1[x]==0){
            vis1[x]=1;
            cout<<x<<" ";
            int len=e[x].size();
            for (int i = 0; i < len; ++i) {//遍历e[i]
                dfs(e[x][i]);
    
            }
        }
    }
    void bfs(int x ){
        queue<int> q;
        q.push(x);
        vis2[x]=1;
        while(!q.empty()) {
            int now = q.front();
                cout << now<<" ";
                q.pop();
                int len = e[now].size();
                for (int i = 0; i < len; ++i) {
                    if (!vis2[e[now][i]]) {
                        q.push(e[now][i]);
                        vis2[e[now][i]]=1;
                    }
                }
            }
    
    }
    int main(){
        int n,m;
        cin>>n>>m;//n个顶点m条边
        for (int i = 0; i < m; ++i) {
            int vv;
            int uu;
            cin>>uu>>vv;
            s.push_back((edge){uu,vv});
    
        }
        sort(s.begin(),s.end(),cmp);
        for (int  i = 0; i < m; ++i) {
            e[s[i].u].push_back(s[i].v);
        }
        dfs(1);
        cout<<endl;
        bfs(1);
    }
    

    p3916
    错误代码:
    调试了半天不知道哪错了,,,
    其实前面那个店不一定遍历所有的点啊

    而且这是个有向图!!!!!!!!!!!!!!!!

    再而且,图论你不考虑dfsbfs不是在作死吗?????????

    //
    //created by Arc on 2021/2/16
    //
    //p3916 of luogu
    #include<iostream>
    #include<vector>
    #include <queue>
    #include <algorithm>
    
    using namespace std;
    struct edge{
        int u;
        int v;
    };
    vector<edge> e;
    vector<int> s[10002];
    int ans[10002];
    bool visited[10012]={0};
    bool cmp(edge a,edge b){
        if(a.u==b.u){
            return a.v<b.v;
        }
        return a.u<b.u;
    }
    int main(){
    
        int m,n;
        cin>>n>>m;//n points,m edges
        for (int i = 0; i < m; ++i) {
            int x,y;
            cin>>x>>y;
            e.push_back((edge){x,y});
        }
        sort(e.begin(),e.end(),cmp);
        for (int i = 0; i < m; ++i) {//注意这里是可以从零开始的,因为e往里push的时候默认从零
            s[e[i].u].push_back(e[i].v);//这里的s[i]就必须从一开始了,这里就是一个个点了
            s[e[i].v].push_back(e[i].u);
            cout<<e[i].u<<endl;
        }
        for (int i = m-1; i >= 0; --i) {//一开始忘记变--
            int len=s[e[i].u].size();
            for (int j = 0; j < len; ++j) {//这里从哪里遍历一样
                if(!visited[s[e[i].u][j]]){
                    visited[s[e[i].u][j]] = true;
                    ans[s[e[i].u][j]]=e[i].u;
                }
            }
        }
        for (int i = 0; i < n; ++i) {
            cout<<ans[i];
        }
    }
    

    借鉴dl的博客:

    #include <iostream>
    #include <cstdio>
    #include <vector>
    using namespace std;
    
    #define MAXL 100010
    
    int N, M, A[MAXL];
    vector<int> G[MAXL]; //vector存图 
    
    void dfs(int x, int d) {
    	if(A[x]) return; //访问过 
    	A[x] = d;
    	for(int i=0; i<G[x].size(); i++)
    		dfs(G[x][i], d);//dfs就可以往里找了
    }
    
    int main() {
    	int u, v;
    	scanf("%d%d", &N, &M);
    	for(int i=1; i<=M; i++) {
    		scanf("%d%d", &u, &v);
    		G[v].push_back(u); //反向建边 
    	}
    	for(int i=N; i; i--) dfs(i, i); 
    	for(int i=1; i<=N; i++) printf("%d ", A[i]);
    	printf("
    ");
    	return 0;
    }
    
    为了自己,和那些爱你的人
  • 相关阅读:
    供安全工程师实用的SOC模型
    Windows-NTFS-ADS在渗透测试中的利用
    域安全的基础知识上
    Linux下利用动态链接劫持库函数并注入代码
    多线程sshd爆破程序代码
    Windows NTLM Hash和Hash传递、Key传递攻击
    替换linux系统文件etc下passwd文件的字段获取真正的root权限
    攻防对抗中常用的windows命令(渗透测试和应急响应)
    获取权限后权限维持的方法
    RocketMQ启动mqbroker.cmd没反应
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/14406817.html
Copyright © 2020-2023  润新知