dijkstra算法背写 int dis[]; int vis[]; void dij(){ 初始值 while(){ 找最小 标记 更新->直到无需更新,跳出循环 } } //设置20*20的邻接矩阵 const int N=20; int t[N][N]; int dis[N];//dis[i]表示x->i的距离 int vis[N];//vis[i]表示x->i的距离是否已经最小 void dij(int x){ //找x到其它点的最短距离, memset(dis,0x3f,sizeof(dis)); dis[x]=0; while(true){ //找最小 int k=0; for(int i=1;i<=n;i++){ if(dis[k]>t[x][i]){ k=i; } } if(k==0) break;//直到无需更新,跳出循环 //标记 vis[k]=1; //更新 for(int i=1;i<=n;i++){ //[x->k->i x->i] if(vis[i]!=1&&dis[k]+t[k][i]<dis[i]){ dis[i]=dis[k]+t[k][i]; } } } } 1341 #include<bits/stdc++.h> using namespace std; int n,m,a,b; int t[105][105]; int d[105];//度 void dfs(int x){ for(int i=1;i<=n;i++){ if(t[x][i]==1){ t[x][i]=t[i][x]=0; dfs(i); } } cout<<x<<" "; } int main(){ cin>>n>>m; for(int i=0;i<m;i++){ cin>>a>>b; t[a][b]=t[b][a]=1; d[a]++; d[b]++; } int j=1; for(int i=1;i<=n;i++){ if(d[i]%2) j=i; if(d[i]==1) {j=i;break;} } dfs(j); return 0; } 作业:1376 |