【算法模板】图论

来源:互联网 发布:淘宝店怎么提升销量 编辑:程序博客网 时间:2024/05/01 14:02

dji:

#include <iostream>#include <cstring>#include <vector>#include <queue>#define N 100 using namespace std;typedef struct No{int u,v,w;No(int a,int b,int c){u=a,v=b,w=c;}bool operator<(const No &dd)const{        return w>dd.w;    }}No;int dist[N];vector<No> q[N];void Dji(int n0){int vis[N];memset(vis,0,sizeof(vis));memset(dist,63,sizeof(dist));dist[n0]=0;vis[n0]=1;priority_queue<No>que;que.push(No(0,n0,dist[n0]));while (!que.empty()){No x=que.top();que.pop();for (int i=0;i<q[x.v].size();i++){No y=q[x.v][i];if (dist[y.v]>dist[x.v]+y.w){dist[y.v]=dist[x.v]+y.w;que.push(No(x.v,y.v,dist[y.v]));}}}}int main(){int m,n;cin>>n>>m;for (int i=0;i<m;i++){int u,v,w;cin>>u>>v>>w;q[u].push_back(No(u,v,w));q[v].push_back(No(v,u,w));}int uu;cin>>uu;Dji(uu);for (int i=1;i<=n;i++) if (i!=uu) cout<<uu<<" to "<<i<<" mincost:"<<dist[i]<<endl; cout<<endl;}/*7 111 2 71 4 52 4 92 3 82 5 74 5 154 6 66 5 86 7 115 7 93 5 5*/

floyd:

#include<cstdio>#include<iostream>#define maxx 101using namespace std;int map[maxx][maxx],n,i,j,k,a,b,q;int main(){    scanf("%d\n",&n);    for (i=1;i<=n;i++)      for (j=1;j<=n;j++)       {   scanf("%d",&map[i][j]);       if (map[i][j]==-1) map[i][j]=100000;   }    for (k=1;k<=n;k++)     for (i=1;i<=n;i++) if (i!=k)      for (j=1;j<=n;j++)  if (i!=j&&j!=k)      {           if  ((map[i][k]+map[k][j]<map[i][j]))map[i][j]=map[i][k]+map[k][j];           }cout<<"查询组数:";cin>>q;    for (i=1;i<=q;i++)     {      cin>>a>>b;     cout<<"min:"<<map[a][b]<<endl;    }    return 0;}/*70 7 -1 5 -1 -1 -17 0 8 9 7 -1 -1-1 8 0 -1 5 -1 -1 5 9 -1 0 15 6 -1-1 7 5 15 0 8 9-1 -1 -1 6 8 0 11-1 -1 -1 -1 9 11 061 2 1 31 41 51 61 7*/


kruskal:

#include<cstdio>#include<iostream>#include<cstdlib>#define maxx 100000using namespace std;typedef struct edge{int x,y,w;}edge;edge e[maxx];int r[maxx],f[maxx];long long sum=0;int find(int x){return x==f[x]?x:f[x]=find(f[x]);}int cmp(const void *a, const void *b){if ((*(edge *)a).w == (*(edge *)b).w) return (*(edge *)a).w-(*(edge *)b).w;return (*(edge *)a).w-(*(edge *)b).w ; }int main(){   ios::sync_with_stdio(false);   int i,n,m,x,y,chx,chy;    cin>>m>>n;    for (i=0;i<n;i++)    {    cin>>e[i].x>>e[i].y>>e[i].w;    f[i]=i;    r[i]=0;    }qsort(e,n,sizeof(edge),cmp);sum=0;for (i=0;i<n;i++) { x=find(e[i].x); y=find(e[i].y); if (x!=y)  { if (r[x]>r[y]) f[y]=x; else { if (r[x]==r[y]) r[y]++; f[x]=y; } sum+=e[i].w; cout<<e[i].x<<"<=>"<<e[i].y<<"  cost:"<<e[i].w<<endl; } } cout<<"mincost:"<<sum<<endl; return 0;}/*7 111 2 71 4 52 4 92 3 82 5 74 5 154 6 66 5 86 7 115 7 93 5 5*/

prim:

#include<cstdio>#include<iostream>using namespace std;#define M 101int map[M][M]={0},cost[M]={0},vis[M]={0},i,j,n,min1,ans=0;int main(){    scanf("%d",&n);    for (i=1;i<=n;i++)   for (j=1;j<=n;j++)  scanf("%d",&map[i][j]);    ans=0;    for (i=1;i<=n;i++)     {     cost[i]=map[i][1];     vis[i]=1;     }     vis[1]=-1;    for (i=1;i<=n;i++)     {      min1=1000000;  int v=-1;  for (j=1;j<=n;j++)   if (vis[j]!=-1&&cost[j]<min1)   {   v=j;    min1=cost[j];   }    if (v!=-1)   {   cout<<i<<"<=>"<<v<<" cost"<<min1<<endl;   ans+=min1;   vis[v]=-1;      for (j=1;j<=n;j++) if (vis[j]!=-1&&map[v][j]<cost[j])   {   cost[j]=map[v][j];   vis[j]=v;   }   }     }    printf("mincost:%d",ans);    return 0;}/*40  4  9 214  0  8 179  8  0 1621 17 16  0*/ 


spfa:

void Spfa()  {      memset(Dis,63,sizeof(Dis));      Dis[1]=0;      Vis[1]=true;      deque<int> Q;      Q.push_back(1);      while(!Q.empty())      {          int u=Q.front();          for(Node *i=G[u].nxt;i;i=i->nxt)          {              int v=i->to,w=i->w;              if(Dis[v]>Dis[u]+w)              {                  Dis[v]=Dis[u]+w;                  if(Vis[v])continue;                  Vis[v]=true;                  if(!Q.empty())                  {                      if(Q.front()>Dis[v])Q.push_front(v);                      else Q.push_back(v);                  }                  else Q.push_back(v);              }          }          Vis[u]=false;      }  }  


topo-DAG:

#include <iostream>#include <cstring>#include <vector>#include <queue>#define N 100 #define maxx 9999999#define minn -1using namespace std;typedef struct No {int u,v,w;No(int a,int b,int c){u=a,v=b,w=c;}}No;vector<No> T[N];vector<int> topol;int dist[N];bool vis[N];void topo(int now){if (!vis[now]) vis[now]=1;for (int i=0;i<T[now].size();i++){if (!vis[T[now][i].v]) topo(T[now][i].v);}topol.push_back(now);}void DAG(int n,int k){for (int i=1;i<=n;i++) dist[i]=maxx;dist[k]=0;for (int i=1;i<=n;i++){for (int j=0;j<T[i].size();j++){int to=T[i][j].v;if (dist[to]>dist[i]+T[i][j].w)dist[to]=dist[i]+T[i][j].w;}}return; }int main(){int m,n;cin>>n>>m;for (int i=0;i<m;i++){int u,v,w;cin>>u>>v>>w;T[u].push_back(No(u,v,w));}memset(vis,0,sizeof(vis));for (int i=1;i<=n;i++) if(!vis[i]) topo(i);for (int i=topol.size()-1;i>=0;i--) cout<<topol[i]<<" ";cout<<endl;int k;cin>>k;DAG(n,k);for (int i=1;i<=n;i++)cout<<k<<" to "<<i<<" mincost:"<<dist[i]<<endl;cout<<endl;}/*7 111 2 71 4 52 4 92 3 82 5 74 5 -54 6 65 6 86 7 115 7 93 5 5*/

无向图双联通分支,割点:

#include<iostream>#include<cstring>#include<vector>#include<stack>#define N 1000using namespace std;typedef struct dd{int u;int v;}dd;int flag[N],low[N],df[N],dfsnum=0,num=0;vector<int> gra[N];vector<int> gp;vector<dd> bri;stack<int> s;void tarjan(int u,int fa){    flag[u]=low[u]=++dfsnum;    s.push(u);    int ch=0;    for(int i=0;i<gra[u].size();i++)    {        int v=gra[u][i];        if(!flag[v])        {        ch++;df[v]=u;            tarjan(v,u);            low[u]=min(low[u],low[v]);            if (df[u]==-1 && ch>1) gp.push_back(u);            if (df[u]!=-1 && flag[u]<=low[v]){ gp.push_back(u);} }        else if(v!=fa)        {            low[u]=min(low[u],flag[v]);        }    }    if(low[u]==flag[u])    {        num++;        cout<<"NO."<<num<<" : ";        while (1)        {            int x=s.top();            cout<<x<<" ";            s.pop();            if(x==u)            {            cout<<endl;                break;        }}    }}int main(){int m,n;cin>>n>>m;memset(df,-1,sizeof(df));memset(flag,0,sizeof(flag));for (int i=0;i<m;i++){int u,v;cin>>u>>v;gra[u].push_back(v);gra[v].push_back(u);//df[u]=v;df[v]=u;dd sd;sd.u=u;sd.v=v;bri.push_back(sd);}cout<<"对于边的双连通分支:"<<endl; for (int i=0;i<n;i++)if (!flag[i]) tarjan(i,-1);cout<<"割点:"<<endl; for (int i=0;i<gp.size();i++) cout<<gp[i]<<" ";cout<<endl<<"桥:"<<endl; for (int i=0;i<m;i++){int uu=bri[i].u,vv=bri[i].v;if (flag[uu]<low[vv]) cout<<uu<<"<->"<<vv<<endl;}//for(int i=0;i<n;i++)cout<<low[i]<<" "<<flag[i]<<" "<<df[i]<<endl;return 0;}

有向图强连通分支:

#include<iostream>#include<cstring>#include<vector>#include<stack>#define N 1000using namespace std;typedef struct dd{int u;int v;}dd;int flag[N],low[N],df[N],dfsnum=0,num=0;vector<int> gra[N];vector<int> gd;stack<int> s;;void tarjan(int u){    flag[u]=low[u]=++dfsnum;    s.push(u);    df[u]=1;     for(int i=0;i<gra[u].size();i++)    {        int v=gra[u][i];        if(!flag[v])        {            tarjan(v);            low[u]=min(low[u],low[v]);        }        else if(df[v])        {            low[u]=min(low[u],flag[v]);        }    }    if(low[u]==flag[u])    {    gd.push_back(u);        num++;        cout<<"NO."<<num<<" : ";        while (1)        {            int x=s.top();            cout<<x<<" ";            s.pop();            df[x]=0;            if(x==u)            {            cout<<endl;                break;        }}    }}int main(){int m,n;cin>>n>>m;for (int i=0;i<m;i++){int u,v;cin>>u>>v;gra[u].push_back(v);}cout<<"强连通分支:"<<endl; memset(flag,0,sizeof(flag));memset(df,0,sizeof(df));for (int i=0;i<n;i++)if (!flag[i]) tarjan(i);for (int i=0;i<gd.size();i++) cout<<gd[i]<<" ";return 0;}/*6 80 20 13 01 34 53 52 42 3*/


0 0
原创粉丝点击