图的基本操作
2015-11-19 16:03
218 查看
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<stack> #include<queue> using namespace std; #define Max 20 int visited[Max]={0}; int indegree[Max]={0}; typedef struct ArcNode { int adj; struct ArcNode *nextarc; }ArcNode; typedef struct { char date; ArcNode *firstarc; }VNode,AdjList[Max]; typedef struct { AdjList vertices; int vexnum,arcnum; }AlGraph; int Located(AlGraph &G,char v) { int i,k=-1; for(i=0;i<G.vexnum;i++) if(v==G.vertices[i].date) { k=i; break; } return k; } void Creat_Graph(AlGraph &G) { int i,j,k; int la,lb; char V1,V2; ArcNode *p,*s; printf("输入图的顶点以及边的个数\n"); scanf("%d%d",&G.vexnum,&G.arcnum); printf("输入图的顶点信息\n"); for(i=0;i<G.vexnum;i++) { getchar(); scanf("%c",&G.vertices[i].date); G.vertices[i].firstarc=NULL; } printf("输入图每条边所依附的顶点\n"); for(k=0;k<G.arcnum;k++) { getchar(); scanf("%c %c",&V1,&V2); la=Located(G,V1); lb=Located(G,V2); s=(ArcNode*)malloc(sizeof(ArcNode)); s->adj=lb; s->nextarc=NULL; p=G.vertices[la].firstarc; if(!p) G.vertices[la].firstarc=s; else { while(p->nextarc) p=p->nextarc; p->nextarc=s; } } } void DFS(AlGraph G,char ch) { int v,w; ArcNode *p; v=Located(G,ch); visited[v]=1; printf("%c ",G.vertices[v].date); p=G.vertices[v].firstarc; while(p) { w=p->adj; if(visited[w]==0) DFS(G,G.vertices[w].date); p=p->nextarc; } } void DFSTravel(AlGraph G) { int v; for(v=0;v<G.vexnum;v++) visited[v]=0; for(v=0;v<G.vexnum;v++) { if(visited[v]==0) DFS(G,G.vertices[v].date); } } void Un_DFSTravel(AlGraph G) { stack<int>S; ArcNode *p; int i; for(i=0;i<G.vexnum;i++) visited[i]=0; for(i=0;i<G.vexnum;i++) { if(visited[i]==0) { visited[i]=1; printf("%c ",G.vertices[i].date); S.push(i); while(!S.empty()) { p=G.vertices[S.top()].firstarc; while(p) { if(!visited[p->adj]) { printf("%c ",G.vertices[p->adj].date); visited[p->adj]=1; S.push(p->adj); p=G.vertices[S.top()].firstarc; } else p=p->nextarc; } S.pop(); } } } } void BFSTravel(AlGraph G) { queue<int>Q; int i,v; ArcNode *p; int s; for(i=0;i<G.vexnum;i++) visited[i]=0; for(v=0;v<G.vexnum;v++) { if(!visited[v]) { visited[v]=1; printf("%c ",G.vertices[v].date); Q.push(v); while(!Q.empty()) { s=Q.front(); p=G.vertices[s].firstarc; while(p) { if(!visited[p->adj]) { visited[p->adj]=1; printf("%c ",G.vertices[p->adj].date); Q.push(p->adj); } else p=p->nextarc; } Q.pop(); } } } } void Finddgree(AlGraph G,int indegree[]) { int i; ArcNode *p; for(i=0;i<G.vexnum;i++) indegree[i]=0; for(i=0;i<G.vexnum;i++) { p=G.vertices[i].firstarc; while(p) { indegree[p->adj]++; p=p->nextarc; } } } void TopologicalSort(AlGraph G) { stack<int>S; int num; int k,i; ArcNode *p; Finddgree(G,indegree); for(i=0;i<G.vexnum;i++) if(!indegree[i]) S.push(i); num=0; while(!S.empty()) { i=S.top(); S.pop(); printf("%c ",G.vertices[i].date); num++; for(p=G.vertices[i].firstarc;p;p=p->nextarc) { k=p->adj; if(!(--indegree[k])) S.push(k); } } if(num<G.vexnum) printf("这是一个有环图\n"); else printf("这是一个无环图\n"); } int main() { AlGraph G; Creat_Graph(G); printf("深度搜索递归序列\n"); DFSTravel(G); putchar('\n'); printf("深度搜索非递归序列\n"); Un_DFSTravel(G); putchar('\n'); printf("广度搜索递归序列\n"); BFSTravel(G); putchar('\n'); printf("拓扑序列\n"); TopologicalSort(G); putchar('\n'); return 0; }
相关文章推荐
- mysql关闭prepareStatement功能
- 使用AsyncTask时出现doInBackground没有调用的处理方法
- ASP.NET MVC Action的参数名与参数类型不同,导致取不到Request数据
- Eclipse用法和技巧十四:自动生成的TODO注释2
- 获得当前登录系统的用户名
- poj 1929 Calories from Fat 模拟水题
- Nginx虚拟主机配置
- 贝塞尔曲线 总结
- android nfc MifareUltralight读写
- Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数
- Jquerry复习
- Eclipse用法和技巧十三:自动生成的TODO注释1
- JS 设置下拉列表的值(设置选中项)
- 四大组件之Activity
- 四大组件之Activity
- 四大组件之Activity
- 四大组件之Activity
- 四大组件之Activity
- 四大组件之Activity
- 四大组件之Activity