pku 1041 John's trip
View Code
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxnode = 50;
const int maxedge = 2000;
struct edge
{
int start;
int end;
};
edge ArrayEdge[maxedge];
int degree[maxnode];
int start;
int NodeNum, EdgeNum;
int anStack[maxedge], pIndex;
int visited[maxedge];
bool Judge()
{
for(int i=1; i<=NodeNum; ++i)
{
if(degree[i]&1 != 0)
{
return false;
}
}
return true;
}
void euler(int s)
{
for(int i=1; i<=EdgeNum; ++i)
{
if(!visited[i] && (ArrayEdge[i].start==s || ArrayEdge[i].end==s))
{
visited[i] = 1;
euler(ArrayEdge[i].start + ArrayEdge[i].end - s);
anStack[pIndex++] = i;
}
}
}
int main()
{
int x, y, z;
while(cin>>x>>y && (x!=0 || y!=0))
{
NodeNum = 0;
EdgeNum = 0;
memset(degree, 0, sizeof(degree));
memset(visited, 0, sizeof(visited));
pIndex = 0;
start = min(x, y);
do
{
cin>>z;
ArrayEdge[z].start = x;
ArrayEdge[z].end = y;
degree[x]++;
degree[y]++;
EdgeNum++;
NodeNum = max(NodeNum, max(x, y));
}while(cin>>x>>y && (x!=0 || y!=0));
if(!Judge())
cout<<"Round trip does not exist."<<endl;
else
{
euler(start);
for(int i=EdgeNum-1; i>=1; --i)
{
cout<<anStack[i]<<" ";
}
cout<<anStack[0]<<endl;
}
}
return 0;
}
第一次用用邻接表存储一个图,唉,说起来,自己也太不灵活了,题目要求输出的是边,可是我用邻接表存储的是每一个节点,这样不仅耗内存,而且慢了好多。
算了,也挺安慰的,没什么大的错误,就是用邻接表的时候指针指得有点晕了,很乱;
不过,额,该骂一下自己,题目都没看清楚,明明已经说了是连通图了,我还用并查集判断了一遍,不过已经删了
有俩个代码,效率差不了多少,就是开内存上的差距太大了,十倍左右
#include<iostream> #include<string> #include<stdlib.h> using namespace std; int d[45],n,m,s[2000],l; bool vis[2000]; typedef struct edge { int x,num; edge *next1; }e,*e1; struct node { e1 next2; }nod[45]; void init() { memset (d,0, sizeof (d)); for ( int i=0;i<=44;i++) nod[i].next2=NULL; } void insert( int v, int w, int t) { e1 root=nod[v].next2,p1,p2; if (root->next1==NULL) { root->next1=(e1) malloc ( sizeof (e)); root->next1->num=t; root->next1->x=w; root->next1->next1=NULL; } else { p1=(e1) malloc ( sizeof (e)); p1->num=t;p1->x=w;p1->next1=NULL; e1 p=root->next1;p2=root; int flag=0; for ( ;p!=NULL;p=p->next1) { if (p->num>t) //这里做了很多余的一件事 { p2->next1=p1; p1->next1=p; flag=1; break ; } p2=p; } if (!flag) p2->next1=p1; } } void dfs( int v) { e1 p=nod[v].next2->next1; for (;p;p=p->next1) { if (!vis[p->num]) { vis[p->num]=1; dfs(p->x); s[l++]=p->num; } } } int main() { int t; while (cin>>n>>m&&(n||m)) { init(); while (n||m) { cin>>t; if (nod[n].next2==NULL) { nod[n].next2=(e1) malloc ( sizeof (e)); nod[n].next2->next1=NULL; } if (nod[m].next2==NULL) { nod[m].next2=(e1) malloc ( sizeof (e)); nod[m].next2->next1=NULL; } insert(n,m,t); insert(m,n,t); d[n]++;d[m]++; cin>>n>>m; } int flag=1; for ( int i=1;i<45;i++) { if (d[i]&&d[i]%2!=0) { flag=0; break ; } } if (flag) { memset (vis,0, sizeof (vis)); l=0; dfs(1); for ( int i=l-1;i>=0;i--) cout<<s[i]<< ' ' ; cout<<endl; continue ; } else cout<< "Round trip does not exist." <<endl; } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· .NET Core GC压缩(compact_phase)底层原理浅谈
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp