1. 程式人生 > 實用技巧 >圖論——鏈式前向星的加邊和刪邊操作

圖論——鏈式前向星的加邊和刪邊操作

點選展開程式碼塊
#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;
}