图论——链式前向星的加边和删边操作

点击展开代码块
#include <bits/stdc++.h>

#define mkp make_pair
#define pb push_back
#define all(x) x.bg,x.ed
#define newline puts("")
#define rep(i,n) for(int i=1;i<=n;++i)
#define rrep(i,n) for(int i=0;i<n;++i)

using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const int maxn = 1e5+10;
const int inf = 0x7f7f7f7f;
const int Mod = 1e9+7;
const double eps = 1e-7;
int head[maxn],cnt=0;
struct edge{
    int u,v,pre,next;
}e[maxn<<1];
//加边
void add(int u,int v){
    e[++cnt].v=v;e[cnt].u=u;e[head[u]].pre=cnt;
    e[cnt].next=head[u];head[u]=cnt;
}
//删边
void del(int id){//边的编号
    if(e[id].pre){
        e[e[id].pre].next=e[id].next;//类似于链表的删点
        e[e[id].next].pre=e[id].pre;
    }
    else{
        head[e[id].u]=e[id].next;
        e[e[id].next].pre=0;
    }
}
int n,m;
struct node{
    int x,y;
}p[10010];

int main(){
    cnt=0;
    cin>>n>>m;
    
    for (int i=0;i<m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
    }
    cout<<"cnt = "<<cnt<<endl;
    for (int u=1;u<=n;u++){
        printf("%d->",u);
        for (int i=head[u];i;i=e[i].next){
            printf("%d ",e[i].v);
        }
        newline;
    }
    del(3);//cnt边的数量不会变化,链式前向星变化,删除第三条边
    // del(1);
    // del(2);
    newline;
    cout<<"cnt = "<<cnt<<endl;
    for (int u=1;u<=n;u++){
        printf("%d->",u);
        for (int i=head[u];i;i=e[i].next){
            printf("%d ",e[i].v);
        }
        newline;
    }
    return 0;
}
posted @ 2020-09-11 13:12  wsl_lld  阅读(697)  评论(0编辑  收藏  举报