大二上学期的一个阶段的编程锻炼

/*#include<stdio.h>
#include<math.h>


int main()
{
printf("%.1f\n",8/5.0);
return 0;
}
#include<stdio.h>
#include<math.h>
int main()
{
    int a;
scanf("%d", &a);
printf("%lf\n",a/2.0);
return 0;
}
#include<stdio.h> //阶乘之和
#include<time.h>
int main()
{
const int MOD = 1000000;
int n, S = 0;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
int factorial = 1;
for(int j = 1; j <= i; j++)
factorial = (factorial * j % MOD);
  S = (S + factorial) %  MOD;
  }
printf("%d\n", S);
printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
#include<stdio.h> //数据统计
int main()
{
int x, n = 1, min, max, s = 0;
scanf("%d", &x);
s = min = max = x;
while(scanf("%d", &x) == 1)
{
s += x;
if(x < min) min = x;
if(x > max) max = x;
n++;
}
printf("%d %d %.3f\n", min, max, (double)s/n);
return 0;
}
#include<stdio.h>                                           //数据统计(fopen版)
#define INF 1000000000
int main()
{
FILE *fin, *fout;
fin = fopen("data.in","rb");
fout = fopen("data.out","wb");
int x, n = 0, min = INF, max = -INF, s = 0;
while(fscanf(fin, "%d", &x) == 1)
{
s +=x;
if(x < min) min = x;
if(x > max) max = x;
n++;
}
fprintf(fout, "%d %d %.3f\n", min, max, (double)s/n);
fclose(fin);
fclose(fout);
return 0;
}
#include<stdio.h>
int main()
{
double i;
for(i = 0; i != 10; i +=0.1)
printf("%.1f\n", i);
return 0;
}
#include<stdio.h> //逆序输出
#define maxn 10000000 //比较大的数组尽可能声明在main函数外,否则程序可能无法运行
int a[maxn];
int main()
{
// int a[maxn];
int x, n = 0;
while(scanf("%d",&x) == 1)
a[n++] = x;
for(int i = n-1; i >=1; i--)
printf("%d ",a[i]);
printf("%d\n",a[0]);
return 0;
}
#include<stdio.h> //开灯问题
#include<string.h> //为了避免输出多余空格,设置了一个标志变量first
#define maxn 1010
int a [maxn];
int main()
{
int n, k, first = 1;
memset(a, 0, sizeof(a));
scanf("%d%d", &n, &k);
for(int i = 1; i <= k; i++)
for(int j = 1; j <= n; j++)
if(j % i == 0) a[j] = !a[j];
for(i = 1; i <= n; i++)
if(a[i]) {if(first) first = 0; else printf(" "); printf("%d", i);}
printf("\n");
return 0;
}
#include<stdio.h> //蛇形填数
#include<string.h>
#define maxn 20
int a[maxn][maxn];
int main()
{
int n, x, y, tot = 0;
scanf("%d", &n);
memset(a, 0, sizeof(a));
tot = a[x=0][y=n-1] = 1;
while(tot < n*n)
{
while(x+1 < n && !a[x+1][y]) a[++x][y] = ++tot;
while(y-1 >= 0 && !a[x][y-1]) a[x][--y] = ++tot;
while(x-1 >= 0 && !a[x-1][y]) a[--x][y] = ++tot;
while(y+1 < n && !a[x][y+1]) a[x][++y] = ++tot;
}
for(x = 0; x < n; x++)
{
for(y = 0; y < n; y++)
printf("%4d",a[x][y]);
printf("\n");
}
return 0;
}
#include<stdio.h> //桶排序 O(M+N)
int main()
{
int book[1001], i, j, t, n;
for(i = 0; i <= 1000; i++)
book[i] = 0;
scanf("%d",&n);
for(i = 1; i <= n; i++)
{
scanf("%d",&t);
book[t]++;
}
for(i = 1000; i >= 1; i--)
for(j = 1; j <= book[i]; j++)
printf("%d ",i);
return 0;
}
#include<stdio.h> //冒泡排序 O(N^2)
struct student
{
char name[21];
int score;
};
int main()
{
struct student a[100],t;
int i, j, n;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%s %d",a[i].name ,&a[i].score );
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(a[j].score <a[j+1].score )
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=1;i<=n;i++)
printf("%s\n",a[i].name );
return 0;
}
#include<stdio.h> //快速排序 O(NlogN)
int a[101],n;


void quicksort(int left, int right)
{
int i, j, t, temp;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j)
{
while(a[j]>=temp && i<j)
j--;
while(a[i]<=temp && i<j)
i++;
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);
quicksort(i+1,right);
return;
}


int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n);
for(i=1;i<=n;i++)
printf("%d ",a[i]);
getchar();getchar(); 
return 0;
}
#include<stdio.h> //队列    先进先出
struct queue
{
int data[100];
int head;
int tail;
};
int main()
{
struct queue q;
int i;
q.head =1;
q.tail =1;
for(i=1; i<=9; i++)
{
scanf("%d",&q.data [q.tail ]);
q.tail++;
}
while(q.head <q.tail )
{
printf("%d ",q.data [q.head ]);
q.head ++;
q.data [q.tail ]=q.data [q.head ];
q.tail ++;
q.head ++;
}
return 0;
}
#include<stdio.h> //栈   后进先出
#include<string.h>
int main()
{
char a[101],s[101];
int i,len,mid,next,top;
gets(a);
len=strlen(a);
mid=len/2-1;
top=0;
for(i=0;i<mid;i++)
s[++top]=a[i];
if(len%2==0)
next=mid+1;
else
next=mid+2;
for(i=next;i<=len-1;i++)
{
if(a[i]!=s[top])
break;
top--;
}
if(top==0)
printf("YES");
else
printf("NO");
return 0;
}
#include<stdio.h>                                           //链表
#include<stdlib.h>
int main()
{
int *p;
p=(int *)malloc(sizeof(int));
*p=10;
printf("%d\n",*p);
return 0;
}
#include<stdio.h> //链表
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*p,*q,*t;
int i,n,a;
scanf("%d",&n);
head = NULL;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
p=(struct node *)malloc(sizeof(struct node));
p->data =a;
p->next =NULL;
if(head==NULL)
head=p;
else
q->next =p;
q=p;
}
scanf("%d",&a);
t=head;
while(t!=NULL)
{
if(t->next == NULL || t->next ->data > a)
{
p=(struct node *)malloc(sizeof(struct node));
p->data =a;
p->next=t->next ;
t->next = p;
break;
}
t=t->next ;
}
t=head;
while(t!=NULL)
{
printf("%d ",t->data );
t=t->next ;
}
return 0;
}
#include<stdio.h> //炸弹人(枚举)
int main()
{
char a[20][20];
int i,j,sum,max=0,p,q,x,y,m,n;
scanf("%d %d",&n,&m);
for(i=0;i<=n;i++)
scanf("%s",a[i]);
for(i=0;i<=n-1;i++)
{
for(j=0;j<m;j++)
{
if(a[i][j]=='.')
{
sum=0;
x=i,y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
x--;
}
x=i,y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
x++;
}
x=i,y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
y--;
}
x=i,y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
y++;
}
if(sum>max)
{
max=sum;
p=i,q=j;
}
}
}
}
printf("%d %d %d",p,q,max);
return 0;
}
#include<stdio.h> //火柴棍(枚举)
int fun(int x)
{
int num=0;
int f[10]={6,2,5,5,4,5,6,3,7,6};
while(x/10!=0)
{
num += f[x%10];
x = x/10;
}
num += f[x];
return num;
}
int main()
{
int a,b,c,m,sum=0;
scanf("%d",&m);
for(a=0;a<=1111;a++)
{
for(b=0;b<=1111;b++)
{
c=a+b;
if(fun(a)+fun(b)+fun(c)==m-4)
{
printf("%d+%d=%d\n",a,b,c);
sum++;
}
}
}
printf("%d",sum);
return 0;
}
#include<stdio.h> //深度搜索
int a[10],book[10],total=0;
void dfs(int step)
{
int i;
if(step==10)
{
if()
{
total++;
printf();
}
return;
}
for(i=1;i<=9;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
}
return;
}
int main()
{
dfs(1);
printf("total=%d",total/2);
return 0;
}
#include<stdio.h> //解救小哈(深度搜索)
int n,m,p,q,min=99999;
int a[51][51],book[51][51];
void depthfirstsearch(int x,int y,int step)
{
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int nx,ny,k;
if(x==p &&y==q)
{
if(step<min)
min=step;
return;
}
for(k=0;k<4;k++)
{
nx=x+next[k][0];
ny=y+nuxt[k][1];
if(nx<1 || nx>n || ny<1 || ny>m)
continue;
if(a[nx][xy]==0 && book[nx][ny]==0)
{
book[nx][ny]=1;
dfs[nx,ny,step+1);
book[nx][ny]=0;
}
}
return;
}
int main()
{
int i,j,startx,starty;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
scanf("%d %d %d %d",&startx,&starty,&p,&q);
book[startx][starty]=1;
dfs(startx,starty,0);
printf("%d",min);
return 0;
}
#include<stdio.h> //广度优先搜索
struct note
{
int x;
int y;
int f;
int s;
};
int main()
{
struct note que[2501];
int a[51][51]={0},book[51][51]={0};
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int head,tail;
int i,j,k,n,m,startx,starty,p,q,tx,ty,flag;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
scanf("%d %d %d %d",&startx,&starty,&p,&q);
head=1;
tail=1;
que[tail].x=startx;
que[tail].y=starty;
que[tail].f=0;
que[tail].s=0;
tail++;
book[startx][starty]=1;
flag=0;
while(head<tail)
{
for(k=0;k<=3;k++)
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<1 || tx>n || ty<1 || ty>m)
continue;
if(a[tx][ty]==0 && book[tx][ty]==0)
{
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
que[tail].f=head;
que[tail].s=que[head].s+1;
tail++;
}
if(tx==p && ty==q)
{
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
pritf("%d",que[tail-1].s);
return 0;
}
#include<stdio.h> //Breadth First Search(炸弹人)
int main()
{
struct note que[410];
int head,tail;
int book[20][20]={0};
int i,j,k,sum,max=0,mx,my,n,m,startx,starty,tx,ty;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
scanf("%d %d %d %d",&n,&m,&startx,&starty);
for(i=0;i<n;i++)
scanf("%s",a[i]);
head=1;
tail=1;
que[tail].x=startx;
que[tail].y=starty;
tail++;
book[startx][starty]=1;
max=getnum(startx,starty);
mx=startx;
my=starty;
while(head<tail)
{
for(k=0;k<4;k++)
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<0 || tx>n-1 || ty<0 ||ty>m-1)
continue;
if(a[tx][ty]=='.' && book[tx][ty]==0)
{
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
tail++;
sum=getnum(tx,ty);
if(sum>max)
{
max=sum;
mx=tx;
my=ty;
}
}
}
head++;
}
printf();
return 0;
}
#include<stdio.h> //Depth First Search(炸弹人)
void dfs(int x,int y)
{
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int k,sum,tx,ty;
sum=getnum(x,y);
if(sum>max)
{
max=sum;
mx=x;
my=y;
}
for(k=0;k<=3;k++)
{
tx=x+next[k][0];
ty=y+next[k][1];
if(tx<0 || tx>n-1 || ty<0 || ty>m-1)
continue;
if(a[tx][ty]=='.' && book[tx][ty]==0)
{
book[tx][ty]=1;
dfs(tx,ty);
}
}
return;
}
int main()
{
int i,startx,starty;
scanf("%d %d %d %d",&n,&m,&startx,&starty);
for(i=0;i<n;i++)
scanf("%s",a[i]);
book[startx][starty]=1;
max=getnum(startx,starty);
mx=startx;
my=starty;
dfs(startx,starty);
printf();
return 0;
}
#include<stdio.h> //图的深度优先遍历
int min=99999999999,book[101],n,e[101][101];
void dfs(int cur,int dis) 
{
int j;
if(dis>min) return;
if(cur==n)
{
if(dis<min) min=dis;
return;
}
for(j=1;j<=n;j++)
{
if(e[cur][j]!=99999 && book[j]==0)
{
book[j]=1;
dfs(j,dis+e[cur][j]);
book[j]=0;
}
}
return;
}
int main()
{
int i,j,m,a,b,c;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) e[i][j]=0;
else e[i][j]=99999;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&a,&b,&c);
e[a][b]=c;
}
book[1]=1;
    dfs(1,0);
printf("%d",min);
return 0;
}
#include<stdio.h> //最短路径(Floyd-Warshall) O(N^3)
int main()
{
int e[10][10],k,i,j,n,m,t1,t2,t3;
int inf=99999;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) e[i][j]=0;
else e[i][j]=inf;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&t1,&t2,&t3);
e[t1][t2]=t3;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%10d",e[i][j]);
}
printf("\n");
}
return 0;
}
#include<stdio.h> //单源最短路径--Dijkstra(贪心策略) 
int main() //O(N^2) 堆排序+邻接表:O((M+N)logN)
{
int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min;
int inf=99999;
scanf("%d %d",&n &m);
for(i=1,i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) e[i][j]=0;
else e[i][j]=inf;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&t1,&t2,&t3);
e[t1][t2]=t3;
}
for(i=1;i<=n;i++)
dis=e[i][j];
for(i=1;i<=n;i++)
book[i]=0;
book[1]=1;
for(i=1;i<=n-1;i++)
{
min=inf;
for(j=1;j<=n;j++)
{
if(book[j]==0 && dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1;
for(v=1;v<=n;v++)
{
if(e[u][v]<inf)
{
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}
int n,m,i; //邻接表
int u[6],v[6],w[6];
int first[5],next[5];
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
first[i]=-1;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&u[i],&v[i],&w[i]);
next[i]=first[u[i]];
first[u[i]]=i;
}
for(i=1;i<=n;i++) //邻接表的遍历(邻接表用于稀疏图)
{
k=first[i];
while(k!=-1)
{
printf("%d %d %d\n",u[k],v[k],w[k]);
k=next[k];
}
}
#include<stdio.h> //Bellman-Ford(邻接矩阵)
int main() //O(MN)
{
int dis[10],i,k,n,m,u[10],v[10],w[10];
int inf=9999999;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d %d %d",&u[i],&v[i],&w[i]);
for(i=1;i<=n;i++)
dis[i]=inf;
dis[1]=0;
for(k=1;k<=n-1;k++)
for(i=1;i<=m;i++)
if(dis[v[i]] > dis[u[i]] + w[i])
dis[v[i]] = dis[u[i]] + w[i];
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}
#include<stdio.h> //Bellman-Ford优化
int main()
{
int dis[10],i,k,n,m,u[10],v[10],w[10],check,flag;
int inf=9999999;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
dis[i]=inf;
dis[1]=0;
for(k=1;k<n;k++)
{
check=0;
for(i=1;i<=m;i++)
{
if(dis[v[i]] > dis[u[i]] + w[i])
{
dis[v[i]] = dis[u[i]] + w[i];
check = 1;
}
}
if(check==0) break;
}
flag=0;
for(i=1;i<=m;i++)
if(dis[v[i]] > dis[u[i]] + w[i]) flag=1;
if(flag==1) printf("此图含有负权回路");
else
{
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
}
return 0;
}
#include<stdio.h> //邻接表的队列优化的Bellman-Ford
int main()
{
int n,m,i,j,k;
int u[8],v[8],w[8];
int first[6],next[8];
int dis[6]={0},book[6]={0};
int que[101]={0},head=1,tail=1;
int inf=9999999;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
dis[i]=inf;
dis[1]=0;
for(i=1;i<=n;i++)
first[i]=-1;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&u[i],&v[i],&w[i]);
next[i]=first[u[i]];
first[u[i]]=i;
}
que[tail]=1;tail++;
book[i]=1;
while(head<tail)
{
k=first[que[head]];
while(k!=-1)
{
if(dis[v[k]]>dis[u[k]]+w[k])
{
dis[v[k]]=dis[u[k]]+w[k];
if(book[v[k]]==0)
{
que[tail]=v[k];
tail++;
book[v[k]]=1;
}
}
k=next[k];
}
book[que[head]]=0;
head++;
}
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}
//树就是不包含回路的连通无向图
//堆--神奇的优先队列(找出最小值或最大值O(logN)远小于O(N))
void siftdown(int i) //最小堆的向下调整
{
int t,flag=0;
while(i*2<=n && flag==0)
{
if(h[i]>h[i*2])
t=i*2;
else
t=i;
if(i*2+1 <=n)
{
if(h[t]>h[i*2+1])
t=i*2+1;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else
flag=1;
}
return;
}
void siftup(int i) //最小堆的向上调整
{
int flag=0;
if(i==1) return;
while(i!=i && flag==0)
{
if(h[i]<h[i/2])
swap(i,i/2);
else
flag=1;
i=i/2;
}
return;
}
#include<stdio.h> //堆排序O(NlogN)
int h[101];
int n;
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
return;
}
void siftdown(int i)
{
int t,flag=0;
while(i*2<=n && flag==0)
{
if(h[i]>h[i*2])
t=i*2;
else
t=i;

if(i*2+1 <=n)
{
if(h[t]>h[i*2+1])
t=i*2+1;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else
flag=1;
}
return;
}
void creat()
{
int i;
for(i=n/2;i>=1;i--)
{
siftdown(i);
}
return;
}
int deletemax()
{
int t;
t=h[1];
h[1]=h[n];
n--;
siftdown(1);
return t;
}
int main()
{
int i,num;
scanf("%d",num);
for(i=1;i<=num;i++)
scanf("%d",&h[i]);
n=num;
creat();
for(i=1;i<=num;i++)
printf("%d ",deletemax());
return 0;
}
#include<stdio.h> //堆排序(优化版)
int h[101];
int n;
void swap(int x,int y);
void siftdown(int i);
void creat();
void heapsort()
{
while(n>1)
{
swap(1,n);
n--;
siftdown(1);
}
return;
}
int main()
{
int i,num;
scanf("%d",&num);
for(i=1;i<=num;i++)
scanf("%d",&h[i]);
n=num;
creat();
heapsort();
for(i=1;i<=num;i++)
printf("%d",h[i]);
return 0;
}
#include<stdio.h> //并查集
int f[1000]={0},n,m,k,sum=0;
void init()
{
int i;
for(i=1;i<=n;i++)
f[i]=i;
return;
}
int getf(int v)
{
if(f[v]=v)
return v;
else
{
f[v]=getf(f[v]);
return f[v];
}
}
void merge(int v,int u)
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)
f[t2]=t1;
return;
}
int main()
{
int i,x,y;
scanf("%d %d",&n,&m);
init();
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
merge(x,y);
}
for(i=1;i<=n;i++)
{
if(f[i]=i)
sum++;
}
printf("%d\n",sum);
return 0;
}
#include<stdio.h> //Kruskal(图的最小生成树)
struct edge
{
int u;
int v;
int w;
};
struct edge e[10];
int n,m;
int f[7]={0},sum=0,count=0;
void quicksort(int left,int right)
{
int i,j;
struct edge t;
if(left>right)
return;
i=left;
j=right;
while(i!=j)
{
while(e.[j].w>=e[left].w && i<j)
j--;
while{e.[i].w<=e[left].w && i<j)
i++;
if(i<j)
{
t=e[i];
e[i]=e[j];
e[j]=t;
}
}
t=e[left];
e[left]=e[i];
e[i]=t;
quicksort(left,i-1);
quicksort(i+1,right);
return;
}
int getf(int v)
{
if(f[v]==v)
return v;
else
{
f[v]=getf(f[v]);
return f[v];
}
}
int merge(int v,int u)
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)
{
f[t2]=t1;
return 1;
}
return 0;
}
int main()
{
int i;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);
quicksort(1,m);
for(i=1;i<=n;i++)
f[i]=i;
for(i=1;i<=m;i++)
{
if(merge(e[i].u,e[i].v))
{
count++;
sum=sum+e[i].w;
}
if(count== n-1)
break;
}
peintf("%d",sum);
return 0;
}
#include<stdio.h> //枚举的Prim(与Djikstra相似) O(N^2)
int main()
{
int n,m,i,j,k,min,t1,t2,t3;
int e[7][7],dis[7],book[7]={0};
int inf=99999999;
int count=0,sum=0;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(j==i) e[i][j]=0;
else e[i][j]=inf;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&t1,&t2,&t3);
e[t1][t2]=t3;
e[t2][t1]=t3;
}
for(i=1;i<=n;i++)
dis[i]=e[i][j];
book[1]=1;
count++;
while(count<n)
{
min=inf;
for(i=1;i<=n;i++)
{
if(book[i]=0 && dis[i]<min)
{
min=dis[i]; 
j=i;
}
}
book[j]=1; count++;
sum=sum+dis[j];
for(k=1;k<=n;k++)
{
if(book[k]==0 && dis[k]>e[j][k])
dis[k]=e[j][k];
}
}
printf("%d",sum);
return 0;
}
#include<stdio.h> //使用堆优化的的Prim更适合于稀疏图
int dis[7],book[7]={0};
int h[7],pos[7],size;
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
t=pos[h[x]];
pos[h[x]]=pos[h[y]];
pos[h[y]]=t;
return;
}
void siftdown(int i)
{
int t,flag=0;
while(i*2<=size && falg==0)
{
if(dis[h[i]]>dis[h[i*2]])
t=i*2;
   else
t=i;
if(i*2+1<=size)
{
if(dis[h[t]]>dis[h[i*2+1]])
t=i*2+1;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else
flag=1;
}
return;
}
void siftup(int i)
{
int flag=0;
if(i==1) return;
while(i!=1 && flag==0)
{
if(dis[h[i]]<dis[h[i/2]])
swap(i,i/2);
else
flag=1;
i=i/2;
}
return;
}
int pop()
{
int t;
t=h[i];
pos[t]=0;
h[1]=h[size];
pos[h[1]]=1;
size--;
siftdown(1);
return t;
}
int main()
{
int n,m,i,j,k;
int u[19],v[19],w[19],first[7],next[19];
int inf=99999999;
int count=0,sum=0;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d %d %d",&u[i],&v[i],&w[i]);
for(i=m+1;i<=2*m;i++)
{
u[i]=v[i-m];
v[i]=u[i-m];
w[i]=w[i-m];
}
for(i=1;i<=n;i++)
first[i]=-1;
for(i=1;i<=2*m;i++)
{
next[i]=first[u[i]];
first[u[i]]=i;
}
book[1]=1;
count++;
dis[1]=0;
for(i=2;i<=n;i++) dis[i]=inf;
k=first[1];
while(k!=-1)
{
dis[v[k]]=w[k];
k=next[k];
}
size=n;
for(i=1;i<=size;i++) 
{
h[i]=i;
pos[i]=i;
}
for(i=size/2;i>=1;i--)
siftdown(i);
pop();
while(count<n)
{
j=pop();
book[j]=1;
count++;
sum=sum+dis[j];
        k=first[j];
while(k!=-1)
{
if(book[v[k]]==0 && dis[v[k]]>w[k])
{
dis[v[k]]=w[k];
siftup(pos[v[k]]);
}
k=next[k];
}
}
printf("%d",sum);
return 0;

#include<stdio.h> //图的割点用邻接表 O(M+N)
int n,m,e[9][9],root;
int num[9],low[9],flag[9],index;
int min(int a,int b)
{
return a<b?a:b;
}
void dfs(int cur,int father)
{
int child=0,i;
index++;
num[cur]=index;
low[cur]=index;
for(i=1;i<=n;i++)
{
if(e[cur][i]==1)
{
if(num[i]==0)
{
child++;
dfs(i,cur);
low[cur]=min(low[cur],low[i]);
if(cur!=root &&low[i]>=num[cur])
flag[cur]=1;
if(cur==root && child==2)
flag[cur]=1;
}
else if(i!=father)
low[cur]=min(low[cur],num[i]);
}
}
return;
}
int main()
{
int i,j,x,y;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
e[i][j]=0;
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
e[x][y]=1;
e[y][x]=1;
}
root=1;
dfs(1,root);
for(i=1;i<=n;i++)
{
if(flag[i]==1)
printf("%d ",i);
}
return 0;
}
#include<stdio.h> //图的割边
int n,m,e[9][9],root;
int num[9],low[9],index;
int min(int a,int b)
{
return a<b?a:b;
}
void dfs(int cur,int father)
{
int i;
index++;
num[cur]=index;
low[cur]=index;
for(i=1;i<=n;i++)
{
if(e[cur][i]==1)
{
if(num[i]==0)
{
dfs(i,cur);
low[cur]=min(low[i],low[cur]);
if(low[i]>num[cur])
printf("%d-%d",cur,i);
}
else if(i!=father)
{
low[cur]=min(low[cur],num[i]);
}
}
}
return;
}
int main()
{
int i,j,x,y;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
for(j=1,j<=n,j++)
e[i][j]=0;
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
e[x][y]=1;
e[y][x]=1;
}
root=1;
dfs(1,root);
return 0;
}
#include<stdio.h> //二分图的最大匹配
int e[101][101];
int match[101];
int book[101];
int n,m;
int dfs(int u)
{
int i;
for(i=1;i<=n;i++)
{
if(book[i]==0 && e[u][i]==1)
{
book[i]=1;
if(match[i]==0 || dfs(match[i]))
{
match[i]=u;
match[u]=i;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,t1,t2,sum=0;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&t1,&t2);
e[t1][t2]=1;
e[t2][t1]=1;
}
for(i=1;i<=n;i++)
match[i]=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
book[j]=0;
if(dfs(i)) sum++;
}
printf("%d",sum);
return 0;
}*/
#include<stdio.h> //第一次算法题
char a[20][20];
int book[20][20],W,H,sum;
void dfs(int x,int y)
{
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int k,sum=1,tx,ty;
for(k=0;k<4;k++)
{
tx=x+next[k][0];
ty=y+next[k][1];
if(tx<0 || tx>H-1 || ty<0 || ty>W-1)
continue;
if(a[tx][ty]=='.' && book[tx][ty]==0)
{
book[tx][ty]=1;
sum++;
dfs(tx,ty);
}
}
}
int main()
{
int i,j,startx,starty;
scanf("%d %d",&W,&H);
for(i=0;i<H;i++)
scanf("%s",a[i]);
for(i=0;i<H;i++)
for(j=0;j<W;j++)
if(a[i][j]=='@') {startx=i,starty=j;}
dfs(startx,starty);
printf("%d",sum);
return 0;
}

基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip 【备注】 1、该资源内项目代码百分百可运行,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值