zoukankan      html  css  js  c++  java
  • 图论板子整理

    SPFA

     1 void spfa(){
     2     queue<int> q;
     3     for(int i=1; i<=n; i++) dis[i]=INF; 
     4     q.push(s); dis[s]=0; vist[s]=1;
     5     while(!q.empty()){
     6     int u=q.front();
     7     q.pop();vist[u]=0;
     8     for(int i=head[u];i;i=edge[i].next)
     9         if(dis[edge[i].to]>dis[u]+edge[i].dis){
    10             dis[edge[i].to]=dis[u]+edge[i].dis;
    11             if(vist[edge[i].to]==0){vist[edge[i].to]=1;q.push(edge[i].to);}
    12         }   
    13     }
    14 }
    15 void spfa(int u){//DFS
    16     vist[u]=1;
    17     for(int i=head[u];i;i=edge[i].nxt){
    18         int g=edge[i].to;
    19         if(dis[g]<dis[u]+edge[i].dis){
    20             dis[g]=dis[u]+edge[i].dis;
    21             spfa(g);
    22         }
    23     }
    24     vist[u]=0;
    25 }


    迪杰

     1 void dij(){
     2 for(int i=1;i<=n;i++)dis[i]=INF;
     3 priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > >q;
     4 dis[s]=0;
     5 q.push(make_pair(0,s));
     6 while(!q.empty())
     7 {
     8 int tt=q.top().second;
     9 q.pop();
    10 if(vist[tt])continue;
    11 vist[tt]=1;
    12 for(int i=head[tt];i;i=edge[i].next)
    13 if(dis[edge[i].to]>dis[tt]+edge[i].dis){dis[edge[i].to]=dis[tt]+edge[i].dis;
    14 q.push(make_pair(dis[edge[i].to],edge[i].to));    }
    15 }
    16 }


    DAG=拓扑配DP

     1 int n,c,id,ne,ans,a,b,m;
     2 struct Edge{int to,next;}edge[MAXN];
     3 int head[MAXN],rd[MAXN],sj[MAXN],f[MAXN];
     4 void adde(int from,int to){
     5     edge[++ne].next=head[from];
     6     edge[ne].to=to;
     7     head[from]=ne;
     8     rd[to]++;
     9 }
    10 void topo()
    11 {
    12     queue<int> q;
    13     f(1,n){if(!rd[i])q.push(i);f[i]=1;}
    14     while(!q.empty()){
    15         int x=q.front();q.pop();
    16         for(int i=head[x];i;i=edge[i].next){
    17         int v=edge[i].to;
    18             f[v]=max(f[v],f[x]+1);
    19             if(!--rd[v])q.push(v);
    20         }
    21     }
    22 }
    23 int main(){
    24 cin>>n>>m;
    25 w(m){cin>>a>>b;adde(a,b);}
    26     topo();    
    27     f(1,n)cout<<f[i]<<endl;
    28 }

    krusal

     1 int main(){
     2     cin>>n>>m;
     3     f(1,m){cin>>a>>b>>c;adde(a,b,c);adde(b,a,c);}
     4     f(1,ne)f[i]=i;
     5     sort(edge+1,edge+ne+1,cmp);
     6     f(1,ne){int x=find(edge[i].from),y=find(edge[i].to);
     7         if(x!=y){cnt++;ans+=edge[i].dis;f[x]=y;}
     8         if(cnt==n-1)break;
     9     }
    10     if(cnt==n-1)cout<<ans;
    11     else cout<<"orz";
    12 }


    PRIM

     1 void prim(){
     2 for(int i=1;i<=n;i++)dis[i]=0x3f3f3f3f;
     3 priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > > q;
     4 dis[1]=0;
     5 q.push(make_pair(0,1));
     6 while(!q.empty()){
     7 int u=q.top().second;q.pop();
     8 if(vist[u])continue;
     9 vist[u]=1;
    10 ++cnt;
    11 ans+=dis[u];
    12 for(int i=head[u];i;i=edge[i].next){
    13 int g=edge[i].to;
    14 if(edge[i].dis<dis[g]){
    15 dis[g]=edge[i].dis;
    16 q.push(make_pair(dis[g],g));
    17 }
    18 }
    19 if(cnt==n)break;
    20 }
    21 } 

    二分图最大匹配

     1 int dfs(int u) {
     2 for(int i=head[u];i;i=edge[i].nxt) {
     3 int g=edge[i].to;
     4 if(!mk[g]){mk[g]=1;if(!vis[g]||dfs(vis[g])) {vis[g]=u;return 1;}}
     5 }
     6 return 0;
     7 }
     8 int main() {
     9 cin>>n>>m>>k;
    10 while(k--){cin>>a>>b;if(a>n||b>m)continue;adde(a,b);}
    11 for(int i=1;i<=n;i++){
    12 memset(mk,0,sizeof(mk));if(dfs(i))++_ans;
    13 } 
    14 cout<<_ans;
    15 }
  • 相关阅读:
    ObjectARX 学习笔记007:创建模态对话框的一般步骤
    c#的DateTime.Now函数详解
    LinQ 使用案例1
    LinQ 泛型方法Array>ForEach在数组中进行迭代并调用自定义的委托
    LinQ Lambda表达式用作泛型活动
    win7x64bit VS2010 CAD2013断点 调试 捕捉成功,困扰一周的问题解决了
    法兰数据库设计方案
    关于CAD的开发思路
    法兰程序CAD开发的进展
    法兰动态块设计思路
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/10376471.html
Copyright © 2011-2022 走看看