数据结构-图

数据结构-图

洛谷 P5318

https://www.luogu.com.cn/problem/P5318

#include<bits/stdc++.h> 
using namespace std;  
struct edge{//存边结构体
    int u,v;//开始结束点  u为开始 v为结束 
};
vector <int> e[100001];
vector <edge> s;
bool vis1[100001]={0},vis2[100001]={0};//标记数组
bool cmp(edge e1,edge e2){//排序规则
    if(e1.v==e2.v)
    return e1.u<e2.u;
    else return e1.v<e2.v;
}
void dfs(int x){//深度优先遍历
    vis1[x]=1;
    cout<<x<<" ";
    for(int i=0;i<e[x].size();i++){
        int point=s[e[x][i]].v;
        if(!vis1[point]){
            dfs(point);
        }
    }
}
void bfs(int x){  //广度优先遍历
    queue <int> q;
    q.push(x);
    cout<<x<<" ";
    vis2[x]=1;
    while(!q.empty()){
        int fro=q.front();
        for(int i=0;i<e[fro].size();i++){
            int point=s[e[fro][i]].v;
            if(!vis2[point]){
                q.push(point); 
                cout<<point<<" ";
                vis2[point]=1;
            }
        }
        q.pop();
    }
}
int main(){
    int n,m;  //输入,存边
    cin>>n>>m; 
    for(int i=0;i<m;i++){
        int uu,vv;
        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(i); 
    dfs(1);   //从1号顶点开始深搜
    cout<<endl;
    bfs(1);   //广搜亦同理
}

 

洛谷 P1113

https://www.luogu.com.cn/problem/P1113

#include<bits/stdc++.h>
#define MAXN 10010 
using namespace std;

int n,x,y,t,ans,len[MAXN],vis[MAXN];
vector<int> linker[MAXN];

int dfs(int x){
    if(vis[x]) return vis[x];
    for(int i=0;i<linker[x].size();i++){
        vis[x]=max(vis[x],dfs(linker[x][i]));
    }
    vis[x] += len[x];
    return vis[x]; 
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x>>len[i];
        while(cin>>y){
            if(!y){
                break;
            }else{
                linker[y].push_back(x);
            }
        }
    }
    for(int i=1;i<=n;i++){
        ans = max(ans,dfs(i));
    }
    cout<<ans<<endl;
    return 0;
} 

洛谷 P4017

https://www.luogu.com.cn/problem/P4017

#include<bits/stdc++.h>
using namespace std;

#define MAXN 5005
#define MAXM 500005
#define MOD 80112002
int n,m,ans;
vector <int> p[MAXN];
queue <int> q;
int f[MAXN],ind[MAXN],outd[MAXN]; 
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        outd[x]++;
        ind[y]++;
        p[x].push_back(y);
    }    
    memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++){
        if(ind[i]==0){
            q.push(i);
            f[i]=1;
        }
    }
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(int i=0,sz=p[x].size();i<sz;i++){
            int y=p[x][i];
            f[y]=(f[x]+f[y])%MOD;
            ind[y]--;
            if(ind[y]==0){
                q.push(y);
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(outd[i]==0){
            ans=(ans+f[i])%MOD;
        }
    }
    cout<<ans<<endl;
}

 

posted @ 2021-05-30 10:37  new-code  阅读(44)  评论(0)    收藏  举报