SPFA,dijskra,prime,topu四种算法的模板

  1 ////#include<stdio.h>
  2 ////#include<string.h>
  3 ////#include<queue>
  4 ////#include<algorithm>
  5 ////using namespace std;
  6 ////const int INF=0x3f3f3f3f;
  7 ////const int MAXN=110;
  8 ////const int MAXM=20010;
  9 ////int top,vis[MAXN],dis[MAXN],head[MAXM];
 10 ////int N,M;
 11 ////queue<int>dl;
 12 ////struct Edge{
 13 ////    int from,to,value,next;
 14 ////    };
 15 ////    Edge edg[MAXM];
 16 ////void initial(){
 17 ////    top=0;
 18 ////    memset(vis,0,sizeof(vis));
 19 ////    memset(dis,INF,sizeof(dis));
 20 ////    memset(head,-1,sizeof(head));
 21 ////    while(!dl.empty())dl.pop();
 22 ////}
 23 ////void add(int u,int v,int value){
 24 ////        Edge E={u,v,value,head[u]};
 25 ////        edg[top]=E;
 26 ////        head[u]=top++;
 27 ////}
 28 ////void SPFA(int sx){
 29 ////    dl.push(sx);
 30 ////    dis[sx]=0;
 31 ////    vis[sx]=1;
 32 ////    while(!dl.empty()){
 33 ////        int u=dl.front();
 34 ////        dl.pop();
 35 ////        vis[u]=0;
 36 ////        for(int i=head[u];i!=-1;i=edg[i].next){
 37 ////                int v=edg[i].to;
 38 ////            if(dis[u]+edg[i].value<dis[v]){
 39 ////                dis[v]=dis[u]+edg[i].value;
 40 ////                if(!vis[v]){
 41 ////                    vis[v]=1;
 42 ////                    dl.push(v);
 43 ////                }
 44 ////            }
 45 ////        }
 46 ////    }
 47 ////    printf("%d\n",dis[N]);
 48 ////}
 49 ////int main(){
 50 ////    int a,b,c;
 51 ////    while(~scanf("%d%d",&N,&M),N|M){
 52 ////            initial();
 53 ////        while(M--){
 54 ////            scanf("%d%d%d",&a,&b,&c);
 55 ////            add(a,b,c);
 56 ////            add(b,a,c);
 57 ////        }
 58 ////    SPFA(1);
 59 ////    }
 60 ////    return  0;
 61 ////}
 62 ///**********************************************/
 63 //#include<stdio.h>
 64 //#include<string.h>
 65 //const int MAXN=110;
 66 //const int INF=0x3f3f3f3f;
 67 //int map[MAXN][MAXN],vis[MAXN],dis[MAXN];
 68 //int N,M;
 69 //void initial(){
 70 //    memset(map,INF,sizeof(map));
 71 //    memset(vis,0,sizeof(vis));
 72 //    memset(dis,INF,sizeof(dis));
 73 //}
 74 //void dijskra(int sx){
 75 //    dis[sx]=0;
 76 //    while(true){
 77 //        int k=-1;
 78 //        for(int i=1;i<=N;i++)
 79 //            if(!vis[i]&&(k==-1||dis[i]<dis[k]))k=i;
 80 //            if(k==-1)break;
 81 //            vis[k]=1;
 82 //            for(int i=1;i<=N;i++)
 83 //                if(!vis[i]&&dis[k]+map[k][i]<dis[i])
 84 //                dis[i]=dis[k]+map[k][i];
 85 //    }
 86 //    printf("%d\n",dis[N]);
 87 //}
 88 //void add(){
 89 //    int a,b,c;
 90 //    while(M--){
 91 //    scanf("%d%d%d",&a,&b,&c);
 92 //    map[a][b]=map[b][a]=c;
 93 //    }
 94 //}
 95 //int main(){
 96 //    while(~scanf("%d%d",&N,&M),N|M){
 97 //        initial();
 98 //        add();
 99 //        dijskra(1);
100 //    }
101 //    return 0;
102 //}
103 ///**********************************************/
104 //#include<stdio.h>
105 //#include<string.h>
106 //const int MAXN=10010;
107 //const int INF=0x3f3f3f3f;
108 //int N,M,ans,flot;
109 //int vis[MAXN],dis[MAXN],map[MAXN][MAXN];
110 //void initial(){
111 //    memset(vis,0,sizeof(vis));
112 //    memset(dis,0x3f,sizeof(dis));
113 //    memset(map,0x3f,sizeof(map));
114 //    ans=0;
115 //    flot=1;
116 //}
117 //void prime(){
118 //    vis[1]=1;
119 //    for(int i=1;i<=N;i++)dis[i]=map[1][i];
120 //    while(true){
121 //            int temp=INF,k;
122 //        for(int i=1;i<=N;i++)
123 //        if(!vis[i]&&dis[i]<temp)temp=dis[k=i];
124 //    if(temp==INF)break;
125 //    vis[k]=1;
126 //    flot++;
127 //    ans+=temp;
128 //    for(int i=1;i<=N;i++)
129 //        if(!vis[i]&&map[k][i]<dis[i])dis[i]=map[k][i];
130 //    }
131 //    printf("%d %d\n",ans,flot);
132 //}
133 //void add(){
134 //    while(M--){int a,b,c;
135 //        scanf("%d%d%d",&a,&b,&c);
136 //        map[a][b]=map[b][a]=c;
137 //    }
138 //}
139 //int main(){
140 //    while(~scanf("%d%d",&N,&M),N|M){
141 //            initial();
142 //            add();
143 //            prime();
144 //    }
145 //    return 0;
146 //}
147 /*********************************************/
148 #include<stdio.h>
149 #include<string.h>
150 #include<queue>
151 using namespace std;
152 const int MAXN=1010;
153 const int MAXM=100010;
154 int head[MAXM];
155 struct Edge{
156     int frome,to,next;
157 };
158 Edge edg[MAXM];
159 int N,M;
160 int que[MAXN],ans[MAXN],top,edgnum;
161 priority_queue<int,vector<int>,greater<int> >dl;
162
163 void initial(){
164     memset(head,-1,sizeof(head));
165     while(!dl.empty())dl.pop();
166     memset(que,0,sizeof(que));
167     top=0;edgnum=0;
168 }
169 void topu(){
170     for(int i=1;i<=N;i++)
171         if(!que[i])dl.push(i);
172     while(!dl.empty()){
173         int k=dl.top();
174         dl.pop();
175         ans[top++]=k;
176         for(int i=head[k];i!=-1;i=edg[i].next){
177             que[edg[i].to]--;
178         if(que[edg[i].to]==0)dl.push(edg[i].to);
179         }
180     }
181     for(int i=0;i<top;i++)printf("%d ",ans[i]);puts("");
182 }
183 void add(int a,int b){
184     Edge E={a,b,head[a]};
185     edg[edgnum]=E;
186     head[a]=edgnum++;
187 }
188 void get(){
189     int a,b;
190     while(M--){
191         scanf("%d%d",&a,&b);
192         que[b]++;
193         add(a,b);
194     }
195 }
196 int main(){
197     while(~scanf("%d%d",&N,&M),N|M){
198         initial();
199         get();
200         topu();
201     }
202     return 0;
203 }
时间: 2024-11-02 23:29:45

SPFA,dijskra,prime,topu四种算法的模板的相关文章

求逆元的四种算法(拓欧费马小线性推欧拉)

求逆元的四种算法 拓展欧几里得算法求逆元 上一篇博客中已经讲过拓展欧几里得算法,并且讲解了求逆元的原理.这里只列出代码 在要求逆元的数与p互质时使用 代码 //扩展欧几里得定理 int ex_gcd(int a,int b,int& x,int& y) { if(b==0) { x=1; y=0; return a; } int ans = ex_gcd(b,a%b,x,y); int tmp = x; x = y; y = tmp-a/b*y; return ans; } int cal

在一个字符串中,统计大写字母个数,小写字母个数,其他字符个数的四种算法

题目描述:编写程序,输出字符串中的大写字母.小写小母和其他的个数.如有一个字符串"Helle, This is A test textfile.123456, tannk you!!",则其大写字母个数:3,小写字母个数:29,其他字符个数:18. 这里提供了四种算法,第一种是我们比较好理解的,也属于硬编码问题,其他三种方法要借助JAVA语言的jdk提供的api. 方法一: <!DOCTYPE html> <html lang="en"> &

图像处理之增强---图像增强算法四种,图示与源码,包括retinex(ssr、msr、msrcr)和一种混合算法

申明:本文非笔者原创,原文转载自:http://blog.csdn.net/onezeros/article/details/6342661 两组图像:左边较暗,右边较亮 第一行是原图像,他们下面是用四种算法处理的结果 依次为: 1.一种混合算法 2.msr,multi-scale retinex 3.msrcr,multi-scale retinex with color restoration 4.ssr,single scale retinex           源码,retinex算法

四种迷宫生成算法

简介 所谓迷宫生成算法,就是用以生成随机的迷宫的算法 迷宫生成算法是处于这样一个场景: 一个row行,col列的网格地图,一开始默认所有网格四周的墙是封闭的 要求在网格地图边缘,也就是网格的边上打通2面墙 所有网格都至少保证网格周围至少有一堵墙打通 所有网格都能通过打通的墙能形成一条通路 博主已实现RecursiveBacktracking(递归回溯),RecursiveSegmentation(递归分割),随机Prim算法,Kruskal+并查集四种迷宫生成算法,这篇文章主要对这四种算法进行简

四种比较简单的图像显著性区域特征提取方法原理及实现-----&gt; AC/HC/LC/FT。

laviewpbt  2014.8.4 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享. 先从最简单的最容易实现的算法说起吧: 1. LC算法 参考论文:Visual Attention Detection in Video Sequences Using Spatiotemporal Cues. Yun Zhai and Mubarak Shah.  Pa

四种简单的图像显著性区域特征提取方法-----&gt; AC/HC/LC/FT。

四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient region detec显著性检测 laviewpbt  2014.8.3 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享.      先从最简单的最容易实现的算法说起吧: 1

并查集类的c++封装,比较union_find algorithm四种实现方法之间的性能差别

问题描述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构: Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集: Union:将两个子集合并成同一个集合: 实现并查集的关键是实现union-find algorithm, 本文根据常用的四种算法,实现了这个类,具体算法实现请参看维基百科: 制造测试数据集,

[C++]四种方式求解最大子序列求和问题

问题 给定整数: A1,A2,-,An,求∑jk=iAk 的最大值(为方便起见,假设全部的整数均为负数,则最大子序列和为0) 比如 对于输入:-2,11,-4,13,-5,-2,答案为20,即从A2到A4 分析 这个问题之所以有意思.是由于存在非常多求解它的算法. 解法一:穷举遍历 老老实实的穷举出全部的可能,代码例如以下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 //计算并返回所

HDU1003 Max Sum 最大子序列和的问题【四种算法分析+实现】

就拿杭电OJ上的第1003题开始吧,这题比原书要复杂一些. Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14. Input The fi