#usr include stdio.h<stdio.h> int main() {int n1=0,n2=0,n3=0; char ch; while((ch=getchar

#include&stdio.h& #include&stdlib.h& #include&string.h& in
#include&stdio.h&#include&stdlib.h&double print_s(int a){double p1[50],p2[50],Sn[50];int i = 0;p1[0] = 2;p2[0] = 1;Sn[0] = p1[0] / p2[0];for (i = 1; i & i++){p1[i] = p1[i - 1] + p2[i - 1];p2[i] = p1[i] - p2[i - 1];Sn[i] = Sn[i - 1] + (p1[i] / p2[i]);}return (Sn[a - 1]);}int main(){printf(&请输入您要打印这个分数序列前几项和:&);scanf(&%d&,&a);printf(&本序列前%d项和Sn=%2.5f/n&,a,print_s(a));system(&pause&);return 0;}&
无相关信息
最新教程周点击榜
微信扫一扫程序错误比较多,思路都错了,改起来实在困难,干脆给你重写算了。注意,因为不知道你的那n个数是怎么输入的,所以我只写了实现你想要的操作的部分,你需要在main()函数里补充上你是如何输入要移动的那n个数据的相关语句。
#include &stdio.h&
#include &conio.h&
int m,n,i,temp,*p,*q;
(这里你应准备好那n个数据,放在指针p指向的内存空间,并将指针q指向一个空闲的内存空间)
printf(&Please input m:&);
scanf(&%d&,&m);
printf(&Please input n:&);
scanf(&%d&,&n);
printf(&You just input m = %d, n = d%\n&, m, n);
for(i=0;i&m;i++)
*(q+i) = *(p+i+n-m);
for(i=0;i&n-m;i++)
*(p+n-i-1) = *(p+n-m-i);
for(i=0;i&m;i++)
*(p+i)=*(q+i);
for(i=0;i&n;i++)
printf(&%d&,*(p+i));
printf(&Invalid m or n number, Please retry!&);
这个程序 完全不能综合啊,综合后,这个电路应该是等效于 out = 1; 完全不能out = 0 啊;
可以这样修改(针对FPGA): reg out = 0; always @(posedge clk) begin
out = ~ end
最理想的修改方式是(针对ASIC): always @(posedge clk) begin
打开这个软件“DATA文件夹到APP文件夹里面想要哪个,长按出来菜单,有全部提取,移动,复制等等。是中文的软件,,,
1、关闭进程里面的游戏,重新进去。
2、不行就重启电脑。
3、还是不能解决就重装游戏。
4、如果还是不行就找张好用的XP关盘,重启电脑(XP安装盘一般都能自动修复系统)。
5、最后还是不行的话,那么我可以告诉你,
1、关闭进程里面的游戏,重新进去。
2、不行就重启电脑。
3、还是不能解决就重装游戏。
4、如果还是不行就找张好用的XP关盘,重启电脑(XP安装盘一般都能自动修复系统)。
5、最后还是不行的话,那么我可以告诉你,
原产权证的房主带身份证原件和产权证原件,还有变更后的新房主的身份证原件,以及更名费啥的,约好时间去房地产中心(大经路的那个)直接办手续就行,加急3天可以,不加急好像得一周。
。。你的那个机床一定用了几年了吧。。。。。你知不知道它有个小电池。。。那个电池坏了程序也就不能在储存了。。三菱PLC的标准是电池只能用三年。。。 如果不是的。那就是你外部有线路有短路。。为什么这样说呢。。因
Windows XP系统最强的启动提速技巧
现在网上的XP启动加速文章多如牛毛,而真正有用的并不多,甚至有一些都是误导读者。我本身也是个 XP用户,对于XP的启动加速也深有感触。看过无数的优化文章,安装过N次的XP,走过很多弯
两种原因!1系统文件丢失照成的系统错误!解决方法从起电脑时安F8进安全模式,看看电脑能不能自我修复,不能只有从做系统。2内存不兼容!或内存有问题了!解决方法换个内存看看是不是还出问题!要是两个内存的话拔掉一
卸载,去官网上下最新版本的安装程序安装。
不行的话, 估计是病毒引起。
使EXE文件破坏了。
杀毒一下试试,不然还原系统看看。
其实这很正常的
你只是一时还不确定自己的感情
你不知道自己到底是喜欢他还是自己一时不习惯没有了他的照顾
但是可以肯定的是:你忘不了和他一起走过的岁月!
不用担心!
至于学习方面,我相信不
一般人在30以后精力跟20几岁的时候没法比了,20几岁,熬夜跟喝水一样平凡,隔天补个觉就恢复过来了,上了30以后多数人都结婚生子,熬个夜,有些时候一个星期都蔫蔫的,做程序的熬个五六年,多数都不注意锻炼,身体、脑力
#include &iostream&int main(){ double i,sum=0; for(i=1.0;i&2.1;i+=0.1)
sum+=i; cout&&sum&& return 0;} 因为计算机中数据是以二进制形式存在的,浮点数没办法精确表达,所以如果写成i&=2.0,那时候其实i已经比2.0要
1.买票2.准备行李,吃的用的,以及足够的钱。3.在火车票上的开车至少半个小时前到达火车站,到进站口安检进站,找到你所买的火车的候车室,然后等候检票上车。4.火车上活动,座位的话就吃吃零食,发发呆。卧铺的话可以一
是硬盘问题,请尽快修复硬盘坏道。
感觉像是映像劫持,要是随便找个文件,比如文本文档,打开要都是那个程序大话,就是映像劫持了,你下个超级巡警,可以解决,中病毒了,还比较厉害!
explorer.exe出错的几种可能原因和解决方法:1.系统资源不足。如果机器配置低的话建议不要同时开启太多应用程序。另外可适当加大虚拟内存,特别是经常玩大型游戏。这种情况下升级机器是最根本的解决办法呵呵。 2.系统文件损
求素数部分错了,i%j==0为真说明i不是素数,你原来的代码弄反了,把不是素数的数存到数组里了。主函数的输出那里我也改了一下,照你原来的输出数字都连在一起了。#include&conio.h&#include&stdio.h&void fun(int m,int k,int xx[]){
你用手机下载的程序?如果你用的是手机自带浏览器,那手机重启后安装文件就没有了。如果你用ucweb下载的程序,安装文件会保留在内存卡里的 UCDOWNLOADED 文件夹里,去那个文件夹里把程序安装文件删除就行了
这个软件可以将你的内存虚拟成一个磁盘,用于提高系统的性能.
如果你的内存大于4G,而又不得不使用32位系统,你可以用这个软件来将系统未能识别的多余的内存,虚拟成一个磁盘,来作为物理磁盘的缓存...
您可能感兴趣的问题1567人阅读
数据结构与算法(6)
&strong&1.n的d次方快速算法 分治法&/strong&
#include&stdio.h&
#include&stdlib.h&
int main(){
int n=3,d=10;
scanf(&%d%d&,&n,&d);
if(n==0&&d==0)
long ans=1;
long temp=n;
if(d&0x01){
printf(&%ld\n&,ans);
&strong&2. n个不同元素划分集合种类2. n个不同元素划分集合种类&/strong&
#include&stdio.h&
#define N 25
int main(){
int T,i,j;
scanf(&%d&,&T);
long data[N][N];
for(i=1;i&N;i++){data[i][i]=1;data[i][1]=1;}
for(i=2;i&N;i++){
for(j=2;j&i;j++){
data[i][j]=data[i-1][j-1]+j*data[i-1][j];
data[i][i]=1;
while(T--){
scanf(&%d&,&n);
long result=0;
for(i=1;i&=n;i++) result+=data[n][i];
printf(&%ld\n&,result);
&strong&3. quick_mod&/strong&
long quick_mod ( long a , long n ,long p ){
long t =a , ret =1;
while( n ){
ret=ret * t-(ret * t/p)*p;
//n右移两位,相当于除2
t = t * t -(t * t/p)*p;
&strong&4. 乘法逆元求解算法&/strong&
#include&stdio.h&
#define Max
extended_gcd( long a, long b, long &x ,long &y){
if(b==0){ x=1; y=0;}
extended_gcd(b,a%b,x,y);
long temp=x;
y=temp-a/b*y;
long inv(long b , long n){
long x=1,y=2;
extended_gcd(b,n,x,y);
x=(x%n+n)%n;
int main(){
while(scanf(&%d&,&n)!=EOF){
int m=2*n-1;
long a=1,b=1;
for(i=n;i&0;i--){
for(i=n;i&1;i--){
long x=inv(b,Max);
//(a/b)%p,求(b*x)%p=1
long ans=a*x%M
printf(&%lld\n&,ans);
&strong&5. 二维度算最大子数组和&/strong&
#include&stdio.h&
int maxSum(int data[100][100],int n,int m){
int max=-127;
int a,c,i,j,start,
for(a=0;a&=n;a++)
for(c=a;c&=n;c++){
for(i=a;i&=c;i++) start+=data[i][m];
for(i=m-1;i&=0;i--){
if(start&0) start=0;
for(j=a;j&=c;j++) start+=data[j][i];
if(start&all) all=
if(all&max) max=
int main(){
int n,i,j;
scanf(&%d&,&n);
int data[100][100];
for(i=0;i&n;i++)
for(j=0;j&n;j++)
scanf(&%d&,&data[i][j]);
printf(&%d\n&,maxSum(data,n-1,n-1));
else if(n==1){
scanf(&%d&,&j);
printf(&%d\n&,j);
else printf(&0\n&);
6. 矩阵n次方分治法&/strong&
#include&stdio.h&
#include &stdlib.h&
#define Max
int main(){
scanf(&%ld&,&t);
while(t&0){
long i,a=1,b=2,c=3,n=4;
scanf(&%ld%ld%ld%ld&,&a,&b,&c,&n);
long sum=a;
if(n==2) sum=b;
else if(n==3) sum=c;
else if(n&3){
long long ans[9]={1,0,0,0,1,0,0,0,1};
long long temp[9]={1,1,1,1,0,0,0,1,0};
long long p[9];
if(n&0x01){
p[0]=(ans[0]*temp[0]+ans[1]*temp[3]+ans[2]*temp[6])%M
p[1]=(ans[0]*temp[1]+ans[1]*temp[4]+ans[2]*temp[7])%M
p[2]=(ans[0]*temp[2]+ans[1]*temp[5]+ans[2]*temp[8])%M
p[3]=(ans[3]*temp[0]+ans[4]*temp[3]+ans[5]*temp[6])%M
p[4]=(ans[3]*temp[1]+ans[4]*temp[4]+ans[5]*temp[7])%M
p[5]=(ans[3]*temp[2]+ans[4]*temp[5]+ans[5]*temp[8])%M
p[6]=(ans[6]*temp[0]+ans[7]*temp[3]+ans[8]*temp[6])%M
p[7]=(ans[6]*temp[1]+ans[7]*temp[4]+ans[8]*temp[7])%M
p[8]=(ans[6]*temp[2]+ans[7]*temp[5]+ans[8]*temp[8])%M
for(i=0;i&9;i++) ans[i]=p[i];
p[0]=(temp[0]*temp[0]+temp[1]*temp[3]+temp[2]*temp[6])%M
p[1]=(temp[0]*temp[1]+temp[1]*temp[4]+temp[2]*temp[7])%M
p[2]=(temp[0]*temp[2]+temp[1]*temp[5]+temp[2]*temp[8])%M
p[3]=(temp[3]*temp[0]+temp[4]*temp[3]+temp[5]*temp[6])%M
p[4]=(temp[3]*temp[1]+temp[4]*temp[4]+temp[5]*temp[7])%M
p[5]=(temp[3]*temp[2]+temp[4]*temp[5]+temp[5]*temp[8])%M
p[6]=(temp[6]*temp[0]+temp[7]*temp[3]+temp[8]*temp[6])%M
p[7]=(temp[6]*temp[1]+temp[7]*temp[4]+temp[8]*temp[7])%M
p[8]=(temp[6]*temp[2]+temp[7]*temp[5]+temp[8]*temp[8])%M
for(i=0;i&9;i++) temp[i]=p[i];
sum=(((ans[0]*c)%Max)+((ans[1]*b)%Max)+((ans[2]*a)%Max))%M
printf(&%ld\n&,sum);
7. 快排&/strong&
void quick_sort(int x[],int l,int u){
int t=x[l];
int j=u+1;
do{i++;}while(i&=u&&x[i]&t);
do{j--;}while(x[j]&t);
temp=x[i];
x[i]=x[j];
temp=x[l];
x[l]=x[j];
quick_sort(x,l,j-1);
quick_sort(x,j+1,u);
8.快速算fibonacci数——矩阵分治法&/strong&
#include&stdio.h&
#define M 10000
int main(){
while(scanf(&%ld&,&n)!=EOF){
int data[2][2]={{1,1},{1,0}};
int sum[2][2]={{1,0},{0,1}};
int temp[2][2];
int result=1;
temp[0][0]=(sum[0][0]*data[0][0]+sum[0][1]*data[1][0])%M;
temp[0][1]=(sum[0][0]*data[0][1]+sum[0][1]*data[1][1])%M;
temp[1][0]=(sum[1][0]*data[0][0]+sum[1][1]*data[1][0])%M;
temp[1][1]=(sum[1][0]*data[0][1]+sum[1][1]*data[1][1])%M;
for(i=0;i&2;i++)
for(j=0;j&2;j++)
sum[i][j]=temp[i][j];
temp[0][0]=(data[0][0]*data[0][0]+data[0][1]*data[1][0])%M;
temp[0][1]=(data[0][0]*data[0][1]+data[0][1]*data[1][1])%M;
temp[1][0]=(data[1][0]*data[0][0]+data[1][1]*data[1][0])%M;
temp[1][1]=(data[1][0]*data[0][1]+data[1][1]*data[1][1])%M;
for(i=0;i&2;i++)
for(j=0;j&2;j++)
data[i][j]=temp[i][j];
result=(sum[0][0]+sum[1][0])%M;
printf(&%d\n&,result);
&strong&9.求公因式gcd&/strong&
long gcd(long x,long y){
return (!y)?x:gcd(y,x%y);
&strong&10. 三个维度进行排序&/strong&
#include&stdio.h&
struct node_1{
void sort_1(node_1* node,int down,int up){
for(int i=i&i++)
for(int j=i+1;j&j++){
if(node[i].intelligence&node[j].intelligence){
node_1 temp=node[i];
node[i]=node[j];
void sort_2(node_1* node,int down,int up){
for(int i=i&i++)
for(int j=i+1;j&j++){
if(node[i].agile&node[j].agile){
node_1 temp=node[i];
node[i]=node[j];
int main(){
int i,n=4,j;
node_1 node[500];
scanf(&%d&,&n);
for(i=0;i&n;i++){
scanf(&%d%d%d&,&node[i].power,&node[i].intelligence,&node[i].agile);
node[i].index=i+1;
for(i=0;i&n;i++)
for(j=i+1;j&n;j++){
if(node[i].power&node[j].power){
node_1 temp=node[i];
node[i]=node[j];
int start=0;
int end=1;
while(end&n){
while(node[start].power==node[end].power&&end&n){
if(end-start&1) {
sort_1(node,start,end);
while(end&n){
while(node[start].intelligence==node[end].intelligence&&node[start].power==node[end].power&&end&n){
if(end-start&1) {
sort_2(node,start,end);
for(i=0;i&n;i++) printf(&%d\n&,node[i].index);
&strong&11. 十进制数转ACM数&/strong&
#include&stdio.h&
int main(){
scanf(&%d&,&T);
while(T&0){
scanf(&%d&,&n);
int ret=1;
int result=0;
int temp=n&0x03;
if(n&0x01){
switch(temp){
case 0:temp=2;
case 1:temp=3;
case 2:temp=1;
case 3:temp=0;
default:printf(&error\n&);
if(temp==2) temp=3;
else if(temp==3) temp=2;
result+=temp*
printf(&%d\n&,result);
&strong&12. 素数筛选法和欧拉函数&/strong&
#include&stdio.h&
#include&stdlib.h&
#include&string&
#define M 5001
#define Max 1000
//#define M 500100
//#define Max 100100
int main(){
//long long phi[M];
long phi[M];
bool prime_bool[M];
long prime[Max];
long len=0;
prime[len++]=2;
for(i=0;i&M;i++) prime_bool[i]=0;
for(i=4;i&M;i+=2) prime_bool[i]=1;
for(i=3;i&M;i+=2)
if(!prime_bool[i]){
prime[len++]=i;
for(j=i*i;j&M;j+=i) prime_bool[j]=1;
phi[1] = 1;
for (i = 2; i & M; i++) {
if (!prime_bool[i]) {
phi[i] = i - 1;
for (j = 0; j & len && prime[j] * prime[j] &= j++) {
if (i % prime[j] == 0) {
if (i / prime[j] % prime[j] == 0)
phi[i] = prime[j] * phi[i / prime[j]];
phi[i] = (prime[j] - 1) * phi[i / prime[j]];
scanf(&%ld&,&n);
//long long sum=0;
long sum=0;
for(i=1;i&=n;i++) sum+=phi[i];
sum=2*sum+1;
printf(&%lld\n&,sum);
&strong&13. 线段树,区间划分统计&/strong&
#include&stdio.h&
#define Max 65538
int data[Max];
void insert(int s,int t,int step,int left,int right){
if(s==left&&t==right){
data[step]++;
if(left==right)
int mid=(left+right)/2;
if(mid&=t) insert(s,t,step*2,left,mid);
else if(mid&s) insert(s,t,step*2+1,mid+1,right);
insert(s,mid,step*2,left,mid);
insert(mid+1,t,step*2+1,mid+1,right);
int search(int i){
int left=0;
int right=65535;
int step=1;
int temp=data[step];
while(left&=right){
int mid=(left+right)/2;
if(i&mid){
step=step*2+1;
left=mid+1;
step=step*2;
temp+=data[step];
if(left==right){}
int main(){
for(i=0;i&Mi++) data[i]=0;
for(i=0;i&3;i++){
scanf(&%d%d&,&s,&t);
insert(s,t,1,0,65535);
scanf(&%d&,&io);
printf(&%d\n&,search(io));
&strong&14. 因式分解60=2 2 3 5&/strong&
#include &stdio.h&
#include &math.h&
#define N 1000000
int arr[N];
void init()
for(i=2;i&sqrt(N);i++)
for(j=2;j&N/i;j++)
arr[i*j]=1;
int main()
while(scanf(&%ld&,&n) && n)
for(i=2,first=1;i&=n;i++)
if(!arr[i])
while(!(n%i))
printf(first ? &%d& : &*%d&,i);
printf(&\n&);
&strong&15. 找函数最小点&/strong&
#include&stdio.h&
#include&math.h&
double cal(double x,int a,int b,int c){
return a*x*x+b*x+c;
double max(double a,double b){
return a&b?a:b;
int main(){
scanf(&%d&,&T);
while(T--){
int a1,b1,c1,a2,b2,c2;
scanf(&%d%d%d&,&a1,&b1,&c1);
scanf(&%d%d%d&,&a2,&b2,&c2);
double min=max(cal(0,a1,b1,c1),cal(0,a2,b2,c2));
int temp=(b1-b2)*(b1-b2)-4*(a1-a2)*(c1-c2);
bool flag=0;
double x1;
if(temp&=0){
if((a1-a2)!=0){
x1=((b2-b1)*1.0+sqrt(temp*1.0))/(2*(a1-a2));
if(x1&0&&x1&1000) flag=1;
double x2=((b2-b1)*1.0-sqrt(temp*1.0))/(2*(a1-a2));
if(x2&0&&x2&1000){
compare=max(cal(x2,a1,b1,c1),cal(x2,a2,b2,c2));
if(compare&min) min=
else if((b1-b2)!=0){
x1=(c2-c1)*1.0/(b1-b2);
if(x1&0&&x1&1000) flag=1;
compare=cal(x1,a1,b1,c1);
if(compare&min) min=
compare=max(cal(,c1),cal(,c2));
if(compare&min) min=
x1=(-1.0*b1)/(2*a1);
compare=max(cal(x1,a1,b1,c1),cal(x1,a2,b2,c2));
if(compare&min) min=
x1=(-1.0*b2)/(2*a2);
compare=max(cal(x1,a1,b1,c1),cal(x1,a2,b2,c2));
if(compare&min) min=
printf(&%.4f\n&,min);
&strong&16. 整数划分次数6=5+1&/strong&
#include&stdio.h&
#include&stdlib.h&
int main(){
long f[101][101];
for(n=1;n&101;n++) f[n][1]=1;
for(n=1;n&101;n++)
for(m=2;m&101;m++){
if(m&n) f[n][m]=f[n][n];
else if(m==n) f[n][m]=1+f[n][m-1];
else if(n-m&m) f[n][m]=f[n-m][n-m]+f[n][m-1];
else f[n][m]=f[n-m][m]+f[n][m-1];
scanf(&%d&,&T);
while(T&0){
scanf(&%d&,&n);
printf(&%ld\n&, f[n][n]);
&strong&17. 字典全排列算法&/strong&
#include&stdio.h&
int input[10]={1,2,3,4,5,6,7,8,9,10};
void perm(int n)
for(i=0;i&n;i++) printf(&%d &,input[i]);
printf(&\n&);
//从最右开始,找到第一个比右边小的数字,赋值给index
int index=-1;
for(i=n-2;i&=0;i--)
if(input[i]&input[i+1])
if(index==-1) // 所有排列遍历完,break while
//再从最右开始,找到input[index]右边比input[index]大的数字
int M=0; // M为监视哨兼临时变量(for swap)
int C; // C为所找到数字的序号
for(int i=n-1;i&=index+1;i--)
if(input[i]&input[index])
M=input[i];
//cout&&index&&& &&&C&&
//交换input[index]和input[C]
input[C]=input[index];
input[index]=M;
//将index后面的部分倒置,比如7421,倒置为1247,只需要对称交换即可
int len=n-1-
for(i=1;i&=len/2;i++)
int t=input[index+i];
input[index+i]=input[n-i];
input[n-i]=t;
for(i=0;i&n;i++) printf(&%d &,input[i]);
printf(&\n&);
int main()
scanf(&%d&,&n);
&strong&18.字符串匹配KMP算法&/strong&
//KMP算法的一种经典实现方法!
* Author:puresky
* Version: KMP 4.0,
* Refer to:Handbook of Exact String-Matching Algorithms, Christian Charras & Thierry Lecroq
#include &stdio.h&
#include &time.h&
#include &string.h&
#include &stdlib.h&
#define MAX_PATTERN_LEN 1024
//preprocessing for KMP
void preKMP(const char* t, int next[], int len)
next[0] = -1; //Attention: next[0] equals -1 other than 0
while(i & len)
while(j & -1 && t[j] != t[i])
j = next[j];
if(t[j] == t[i])
next[i] = next[j];
// KMP, ensure strlen(t) & MAX_PATTERN_LEN
int KMP(const char* s, const char* t)
int next[MAX_PATTERN_LEN];
int lens = strlen(s);
int lent = strlen(t);
preKMP(t, next, lent);
i = j = 0;
while(i & lens)
while(j & -1 && t[j] != s[i])
j = next[j];
if(j &= lent) return i -
return -1;
int main(int argc, char** argv)
char s[100]=&aaaabaaaaaaab&;
char t[15]=&aaaab&;
printf(&S:%s\nT:%s\n&, s, t);
int r1 = KMP(s, t);
//-1未匹配到,否则会返回匹配位置
printf(&%d\n&,r1);
&strong&19. 计算大数aXb中各数字的数量,输出出现次数最多的数字&/strong&
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
int main(){
int data[10];
long b=14;
char a[10001];
while(scanf(&%s%ld&,&a,&b)!=EOF){
for(i=0;i&10;i++) data[i]=0;
int a_length=0;
while(a[a_length++]!='\0');
char temp[2];
temp[0]=a[a_length-2];
temp[1]='\0';
long lipi=b*atoi(temp);
data[lipi%10]++;
for(i=a_length-3;i&=0;i--){
temp[0]=a[i];
temp[1]='\0';
lipi=b*atoi(temp)+
data[lipi%10]++;
while(lipi){
data[lipi%10]++;
int data_max=data[0];
for(i=1;i&10;i++){
if(data[i]&data_max){
data_max=data[i];
bool flag_first=
for(i=0;i&10;i++){
if(data[i]==data_max){
if(flag_first){
printf(&%d&,i);
flag_first=
else printf(& %d&,i);
printf(&\n&);
&strong&20. kruskal最小生成树算法计算图的最小消耗&/strong&
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
#define Max_len 100005
typedef struct node{
struct node *
typedef struct{
edgenode *
typedef struct{
edgenode *front,*
long pre_index[Max_len];
int EMPTY(linkqueue *q){
if(q-&front==q-&rear) return 1;
else return 0;
void ENQUEUEQ(linkqueue *q,long x){
q-&rear-&next=(edgenode*)malloc(sizeof(edgenode));
q-&rear=q-&rear-&
q-&rear-&adjvex=x;
q-&rear-&next=NULL;
long DEQUEUEQ(linkqueue *q){
edgenode *s;
if(EMPTY(q)) return -1;
s=q-&front-&
if(s-&next==NULL){
q-&front-&next=NULL;
q-&rear=q-&
else q-&front-&next=s-&
void quick_sort(long x[],long l,long u){
long t=x[l];
long j=u+1;
do{i++;}while(i&=u&&x[i]&t);
do{j--;}while(x[j]&t);
temp=x[i];
x[i]=x[j];
temp=x[l];
x[l]=x[j];
quick_sort(x,l,j-1);
quick_sort(x,j+1,u);
struct edge{
long fromvex,
void quick_sort_2(edge x[],int l,int u){
long t=x[l].
int j=u+1;
do{i++;}while(i&=u&&x[i].length&t);
do{j--;}while(x[j].length&t);
temp=x[i];
x[i]=x[j];
temp=x[l];
x[l]=x[j];
quick_sort_2(x,l,j-1);
quick_sort_2(x,j+1,u);
int main(){
int case_count=1;
scanf(&%d&,&T);
while(T--){
printf(&Case #%d:\n&,case_count);
case_count++;
vexnode ga[Max_len];
long triangle[Max_len];
int sign[Max_len];
edge data[Max_len];
int G[Max_len];
long i,j,k,n,l,i1;
scanf(&%ld&,&n);
edgenode *s;
for(i=0;i&=n;i++) {ga[i].link=NULL;ga[i].num=0;}
for(i=0;i&=n;i++) {sign[i]=0;G[i]=i;}
for(i=0;i&n-1;i++){
scanf(&%ld%ld%ld&,&data[i].fromvex,&data[i].endvex,&data[i].length);
quick_sort_2(data,0,n-2);
while(j&n-1){
k=data[i].
l=data[i].
sign[i]=1;
if(G[k]==G[l]) sign[i]=2;
s=(edgenode*)malloc(sizeof(edgenode));
s-&adjvex=data[i].
s-&next=ga[data[i].fromvex].
s-&length=data[i].
ga[data[i].fromvex].link=s;
ga[data[i].fromvex].num++;
s=(edgenode*)malloc(sizeof(edgenode));
s-&adjvex=data[i].
s-&next=ga[data[i].endvex].
s-&length=data[i].
ga[data[i].endvex].link=s;
ga[data[i].endvex].num++;
for(i1=0;i1&n;i1++)
if(G[i]==G[l]) G[i]=G[k];
scanf(&%d&,&m);
for(j1=0;j1&m;j1++){
long s1,t;
scanf(&%ld%ld&,&s1,&t);
linkqueue *q;
q=(linkqueue*)malloc(sizeof(linkqueue));
q-&front=(edgenode*)malloc(sizeof(edgenode));
q-&front-&next=NULL;
q-&rear=q-&
//printf(&%d\n&,s1);
int visit[Max_len];
for(i=0;i&=n;i++) visit[i]=0;
visit[s1]=1;
ENQUEUEQ(q,s1);
int find_t=0;
for(i=0;i&=n;i++) pre_index[i]=-1;
while(!EMPTY(q)){
i=DEQUEUEQ(q);
int n_count=ga[i].
int q_count=0;
while(q_count&n_count){
if(visit[s-&adjvex]!=1){
pre_index[s-&adjvex]=i;
//printf(&%d-&%d\n&,i,s-&adjvex);
if(s-&adjvex==t){
goto next_1;
visit[s-&adjvex]=1;
ENQUEUEQ(q,s-&adjvex);
q_count++;
int find_triangle=0;
if(find_t){
long triangle_num=0;
long index=s-&
while(index!=s1){
s=ga[pre_index[index]].
int n_count=ga[pre_index[index]].
int q_count=0;
while(q_count&n_count){
if(s-&adjvex==index)
else s=s-&
q_count++;
triangle[triangle_num]=s-&
//printf(&%d\n&,s-&length);
triangle_num++;
index=pre_index[index];
if(triangle_num&2){
quick_sort(triangle,0,triangle_num-1);
for(i=0;i&triangle_i++)
for(j=i+1;j&triangle_j++)
for(k=j+1;k&triangle_k++){
if(triangle[k]&triangle[i]+triangle[j]){find_triangle=1;}
if(find_triangle) printf(&Yes\n&);
else printf(&No\n&);
&strong&21. 二分图最大匹配匈牙利算法&/strong&
//匈牙利算法复杂度o(nm)
#include&stdio.h&
#include &iostream&
const int MAXN = 1001 ,MAXM = 1001 ;
int n1,n2,m, //n1,n2分别为二分图两边节点的个数,两边的节点分别用1..n1,1..n2编号,m为边数
bool g[MAXN][MAXM]; //图G邻接矩阵g[x][y]
bool y[MAXM]; //Y集合中点i访问标记
int link[MAXM]; //link[y]表示当前与y节点相邻的x节点
bool find(int x) //是否存在X集合中节点x开始的增广路
for (i = 1 ;i &= n2;i++)
if (g[x][i] && !y[i]) //如果节点i与x相邻并且未访问过
if (link[i] == -1 || find(link[i])) //如果找到一个未盖点i中或从与i相邻的节点出发有增广路
int main()
int a,b,i;
memset(g,0 ,sizeof (g));
memset(link,-1 ,sizeof (link));
scanf(&%d%d%d& ,&n1,&n2,&m);
for (i = 1 ;i &=i++)
scanf(&%d%d& ,&a,&b);
for (i = 1 ;i &= n1;i++)
memset(y,0 ,sizeof (y));
if (find(i))
printf(&%d\n& ,ans);
return 0 ;
22.两点最短路径Dijkstra算法&/strong&
#include&stdio.h&
#define N 100
#define Max 10000
//边无穷大代表的值
//节点v到其他每个节点的最小路径值
int p[N],s[N];
int dist[N][N];
//顶点邻接矩阵
void Dijkstra(int v,int n){
int i,j,k,v1,min,max=10000;
for(i=0;i&n;i++){
D[i]=dist[v1][i];
if(D[i]!=Max) p[i]=v1+1;
else p[i]=0;
for(i=0;i&n;i++){
min=10001;
for(j=0;j&n;j++)
if((!s[j])&&(D[j]&min)){
for(j=0;j&n;j++)
if((!s[j])&&(D[j]&D[k]+dist[k][j])){
D[j]=D[k]+dist[k][j];
for(i=0;i&n;i++){
printf(&%d %d&,D[i],i);
while((pre!=0)&&(pre!=v+1)){
printf(&&-%d&,pre-1);
pre=p[pre-1];
printf(&&-%d\n&,v);
int main(){
int data[6][6]={{0,6,9,8,},{18,0,7,,10},{9,,},{,12,0,},{,4,00},{24,5,00,0}};
int n=6,i,j;
for(i=0;i&n;i++)
for(j=0;j&n;j++)
dist[i][j]=data[i][j];
Dijkstra(4,n);
&strong&23. 两点最短路径负权值边SPFA算法&/strong&
#include&iostream&
#include &vector&
#include &queue&
const int SIZE = 100010;
const int INF = 0x3f3f3f3f;
int u[4*SIZE], w[4*SIZE], v[4*SIZE], next[4*SIZE];
//一般是4*SIZE
int first[SIZE], d[SIZE];
int sum[SIZE];
//n个顶点,m条边。
int spfa(int src)
queue&int&
bool inq[SIZE] = {0};
for(int i = 0; i &= i++) d[i] = (i == src)? 0:INF;
q.push(src);
while(!q.empty())
int x = q.front();
inq[x] = 0;
for(int e = first[x]; e!=-1; e = next[e])
if(d[v[e]] & d[x]+w[e])
d[v[e]] = d[x]+w[e];
if(!inq[v[e]])
inq[v[e]] = 1;
if(++sum[v[e]] & n)
//判断负环
return -1;
q.push(v[e]);
if(d[n] == INF) return -2;
else return d[n];
//d[i]是 src到i的最短路径长度,d[n]返回src到n的最短距离
int main()
memset(first, -1, sizeof(first));
scanf(&%d%d&,&n,&m);
for(i = 0; i & i++)
scanf(&%d%d%d&, &u[i], &v[i], &w[i]);
next[i] = first[u[i]];
first[u[i]] =
int min_path=spfa(1);
//源起始节点,求到其他各节点的最短距离,点的编号要从1到n开始,0不可以
printf(&%d\n&,min_path);
&strong&24.图中任意两点最短路径Floyd算法&/strong&
#include&stdio.h&
#define N 101
#define Max 10000
int path[N][N];
int A[N][N];
int dist[N][N];
void Floyd(int n){
int i,j,k,next,max=10000;
for(i=0;i&n;i++)
for(j=0;j&n;j++){
if(dist[i][j]!=Max) path[i][j]=i+1;
else path[i][j]=0;
A[i][j]=dist[i][j];
for(k=0;k&n;k++)
for(i=0;i&n;i++)
for(j=0;j&n;j++)
if(A[i][j]&(A[i][k]+A[k][j])){
A[i][j]=A[i][k]+A[k][j];
path[i][j]=path[k][j];
for(i=0;i&n;i++)
for(j=0;j&n;j++){
printf(& %d %d&,A[i][j],j);
int pre=path[i][j];
while((pre!=0)&&(pre!=i+1)){
printf(&&-%d&,pre-1);
pre=path[i][pre-1];
printf(&&-%d\n&,i);
int main(){
int data[6][6]={{0,6,00,10000},{18,0,7,,10},{9,,},{,12,0,},{,4,00},{24,5,00,0}};
int n=6,i,j;
for(i=0;i&n;i++)
for(j=0;j&n;j++)
dist[i][j]=data[i][j];
&strong&25. 网络最大流SAP算法&/strong&
#include&stdio.h&
#include &iostream&
#include &queue&
#define msize 1024
//最大顶点数目
int d[msize];
int r[msize][msize];
//残留网络,初始为原图
int num[msize];
//num[i]表示标号为i的顶点数有多少
int pre[msize];
//记录前驱
int n,m,s,t;
//m个顶点,n条边,从源点s到汇点t
//此处别忘了在使用最大流之前先调用此函数初始化标号
void ini_d() //BFS计算标号,汇点t标号为0
queue&int&Q;
memset(d,1,sizeof(d));
//将距离设置成为无穷大,此处亦可以使用for循环实现
memset(num,0,sizeof(num));
Q.push(t);
//汇点的标号为0
while (!Q.empty())
k=Q.front(),Q.pop();
for (int i=0;i&m;i++)
//遍历所有的结点
if (d[i]&=m&&r[i][k]&0) //此处要特别注意,通过frontint的值改变其他的距离标号
d[i]=d[k]+1;
Q.push(i);
num[d[i]]++;
int findAlowArc(int i)
//从i出发寻找允许弧
for (j=0;j&m;j++) if (r[i][j]&0&&d[i]==d[j]+1)
return -1;
int min(int a,int b){
return a&b?b:a;
int reLable(int i)
//重新标号
int mm=INT_MAX;
for (int j=0;j&m;j++)
if (r[i][j]&0) mm=min(mm,d[j]+1);
return mm==INT_MAX?m:
int maxFlow(int s,int t)
//从源点s出发的最大流
int flow=0,i=s,j;
memset(pre,-1,sizeof(pre));
while (d[s]&m)
j=findAlowArc(i);
//从前往后找
//更新残留网络
delta=INT_MAX;
for (i=t;i!=s;i=pre[i]) delta=min(delta,r[pre[i]][i]); //找到增广路径的增量
for (i=t;i!=s;i=pre[i]) r[pre[i]][i] -= delta, r[i][pre[i]] += //更改流量
int x=reLable(i);
//重新标号
num[d[i]]--;
if (num[d[i]]==0)
//间隙优化
if (i!=s) i=pre[i];
int main(){
scanf(&%d%d&,&m,&n);
for(i=0;i&n;i++){
scanf(&%d%d%d&,&a,&b,&vex);
//编号从0开始
//r[a-1][b-1]=
//编号从1开始
//source node
//end node
printf(&%d\n&,maxFlow(s,t));
for(i=0;i&m;i++) printf(&%d-&%d\n&,pre[i],i);
&strong&26.网络最大流最小费用算法&/strong&
#include&iostream&
#define Max 1000
int inf=10000;
int cap[Max][Max], pre[Max];
int cost[Max][Max], dis[Max];
int que[Max];
bool vis[Max];
bool spfa(){
源点为0,汇点为n。
int i, head = 0, tail = 1;
for(i = 0; i &= i ++){
dis[0] = 0;// dis 表示 最小 花费
que[0] = 0;
while(tail != head){
循环队列。
int u = que[head];
for(i = 0; i &= i ++)
if(cap[u][i] && dis[i] & dis[u] + cost[u][i]){
存在路径,且权值变小。
dis[i] = dis[u] + cost[u][i];
if(!vis[i]){
que[tail ++] =
if(tail == Max) tail = 0;
if(head == Max) head = 0;
if(dis[n] == inf)
int min(int a,int b){
return a&b?b:a;
void end(){
int i, sum =
for(i = i != 0; i = pre[i])
sum = min(sum, cap[pre[i]][i]);
for(i = i != 0; i = pre[i]){
cap[pre[i]][i] -=
cap[i][pre[i]] +=
ans += cost[pre[i]][i] *
cost[][]记录的为单位流量费用,必须得乘以流量。
//printf(&ans: %d\n&,ans);
int main(){
scanf(&%d%d&,&n,&m);//n个顶点 m条边
int i,u,v,ca,
for(i=0;i&m;i++){
scanf(&%d%d%d%d&,&u,&v,&ca,&co);
cap[u][v]=
cost[u][v]=
//编号为0...n-1,n-1为汇点编号
while(spfa()){
//源点为0,汇点为n。
printf(&ans: %d\n&,ans);
&strong&27. 最小生成树:kruskal算法,复杂度和边有关
#include&stdio.h&
typedef struct{
int fromvex,
#define N 101
edge tree[N];
void quick_sort_2(edge x[],int l,int u){
int t=x[l].
int j=u+1;
do{i++;}while(i&=u&&x[i].length&t);
do{j--;}while(x[j].length&t);
temp=x[i];
x[i]=x[j];
temp=x[l];
x[l]=x[j];
quick_sort_2(x,l,j-1);
quick_sort_2(x,j+1,u);
void kruskal(int n,int e){
//n顶点数目,e图中边数目
int i,i1,j,k,l;
for(i=0;i&=n;i++)
for(i=0;i&e;i++){
scanf(&%d %d %d&,&tree[i].fromvex,&tree[i].endvex,&tree[i].length);
tree[i].sign=0;
quick_sort_2(tree,0,e-1);
while(j&n-1){
k=tree[i].
l=tree[i].
tree[i].sign=1;
if(G[k]==G[l]) tree[i].sign=2;
printf(&%d\n&,tree[i].length);
for(i1=0;i1&n;i1++){
if(G[i1]==G[l]) G[i1]=G[k];
G[l]=G[k];
int main(){
scanf(&%d%d&,&n,&e);
kruskal(n,e);
&strong&28. 最小生成树:prime算法,复杂度和顶点有关&/strong&
#include&stdio.h&
typedef struct{
int fromvex,
#define N 100
float dist[N][N];
edge T[N-1];
//最后生成的最小生成树存在这里面,为0~n-2,
void Prime(int i,int n){
int j,k,m,v,min,max=10000;
for(j=0;j&n-1;j++){
T[j].fromvex=v;
if(j&=v){T[j].endvex=j+1;T[j].length=dist[v][j+1];}
else{T[j].endvex=j;T[j].length=dist[v][j];}
for(k=0;k&n-1;k++){
for(j=k;j&n-1;j++)
if(T[j].length&min){min=T[j].m=j;}
e=T[m];T[m]=T[k];T[k]=e;
for(j=k+1;j&n-1;j++){
d=dist[v][T[j].endvex];
if(d&T[j].length){
T[j].length=d;
T[j].fromvex=v;
int main(){
float data[6][6]={{00,},{10,,10000,11},{00,6,},{,},{19,,18,10000,33},{21,11,,10000}};
int n=6,i,j;
for(i=0;i&n;i++)
for(j=0;j&n;j++)
dist[i][j]=data[i][j];
Prime(0,n);
for(i=0;i&n-1;i++) printf(&%d-&%d : %f \n&,T[i].fromvex,T[i].endvex,T[i].length);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:690175次
积分:10691
积分:10691
排名:第932名
原创:406篇
转载:89篇
评论:213条
文章:29篇
阅读:45870
文章:47篇
阅读:194886
文章:27篇
阅读:58807
文章:15篇
阅读:85583
文章:25篇
阅读:16990
文章:47篇
阅读:20187
文章:35篇
阅读:115313
(1)(4)(2)(3)(10)(9)(59)(59)(38)(45)(15)(104)(119)(23)(2)(3)

我要回帖

更多关于 c include stdio.h 的文章

 

随机推荐