圖論——鏈式前向星的加邊和刪邊操作
阿新 • • 發佈:2020-09-11
點選展開程式碼塊
#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; }