标签:acm 整数 limit color str 表示 false 初始化 输出
连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000)、边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,每行给出一对正整数,表示一条边相关联的两个顶点的编号。
若可以点亮所有结点的灯,则输出从S开始并以S结束的序列,序列中相邻的顶点一定有边,否则只输出部分点亮的灯的结点序列,最后输出0,表示此迷宫不是连通图。
访问顶点时约定以编号小的结点优先的次序访问,点亮所有可以点亮的灯后,以原路返回的方式回到起点。
1 6 8 1 1 2 2 3 3 4 4 5 5 6 6 4 3 6 1 5
1 2 3 4 5 6 5 4 3 2 1
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 #define MVN 1010 /*本地运行时改为100左右才可以,不然运行时错误,提交时改为1000+可AC*/ 7 8 typedef struct AdjMatrix 9 { 10 int w; 11 char *info; 12 }AM; 13 14 typedef struct MGraph 15 { 16 int vex[MVN]; 17 AM arc[MVN][MVN]; 18 int vexnum,arcnum; 19 int k; 20 }MG; 21 22 void creat(MG &G) 23 { 24 int i,j,k; 25 for(k=1;k<=G.vexnum;k++) 26 { 27 G.vex[k]=k; 28 } 29 for(k=1;k<=G.arcnum;k++) 30 { 31 scanf("%d %d",&i,&j); 32 G.arc[i][j].w=1; 33 G.arc[j][i].w=1; 34 } 35 } 36 37 int count=0; //计数变量 38 int DFS(MG &G,bool *visited,int i) 39 { 40 count++; 41 visited[i]=true; 42 if(G.vex[i]==G.k) 43 printf("%d",G.k); 44 else 45 printf(" %d",G.vex[i]); 46 int k; 47 for(k=1;k<=G.vexnum;k++) 48 { 49 if(G.arc[i][k].w>0&&visited[k]==false) 50 { 51 DFS(G,visited,k); 52 printf(" %d",G.vex[i]); 53 } 54 } 55 return count; 56 } 57 58 int main() 59 { 60 int t; 61 scanf("%d",&t); 62 while(t--) 63 { 64 MG G={0}; 65 scanf("%d %d %d",&G.vexnum,&G.arcnum,&G.k); 66 creat(G); 67 int k; 68 for(k=1;k<=G.vexnum;k++) 69 { 70 if(G.vex[k]==G.k) 71 break; 72 } 73 bool visited[MVN]={false}; 74 count=0; 75 if(DFS(G,visited,k)!=G.vexnum) 76 printf(" 0\n"); 77 else 78 printf("\n"); 79 } 80 return 0; 81 } 82 83 /*************************************************** 84 User name: *** 85 Result: Accepted 86 Take time: 12ms 87 Take Memory: 1784KB 88 Submit time: 2016-11-08 21:57:57 89 ****************************************************/
标签:acm 整数 limit color str 表示 false 初始化 输出
原文地址:http://www.cnblogs.com/Mimick/p/6044907.html