Show all threads Hide all threads Show all messages Hide all messages | why i got Crash (ACCESS_VIOLATION)??????????????????Can you help me? | arthur | 1077. Travelling Tours | 12 Dec 2024 20:06 | 3 | CODE IS HERE; #include "stdio.h" #include "string.h" long a[401][401]; long n,h,t; long i,j,m; int c[500]; int p[500]; long count=0; void bfs(int i) { int k; for(k=1;k<=n;k++) { if(c[k]==0) { if(a[i][k]==1) { a[i][k]=0; a[k][i]=0; c[k]=1; p[k]=i; bfs(k); } } } } void path(int a1,int a2) { int q[500]; int i=0; while(1) { q[i]=a2; i++; a2=p[a2]; if(a2==a1) break; } printf("%d",i+1); printf(" %d",a1); while(i>0) { printf(" %d",q[i-1]); i--; } printf("\n");
}
void main() { for(i=0;i<401;i++) for(j=0;j<401;j++) a[i][j]=0; scanf("%ld %ld",&n,&m); for(i=0;i<m;i++) { scanf("%ld %ld",&h,&t); a[h][t]=1; a[t][h]=1; } for(i=1;i<=n;i++) c[i]=0;
c[1]=1; bfs(1);
for(i=1;i<n;i++) { for(j=i+1;j<=n;j++) if(a[i][j]==1) { count++; } } printf("%ld\n",count); for(i=1;i<n;i++) { for(j=i+1;j<=n;j++) if(a[i][j]==1) { path(i,j); } }
} I have same problem and increased answer's array. got AC Try this 7 8 1 2 2 6 1 6 4 6 4 3 3 5 5 6 3 7 | I know the agorithm, but who can prove it? | StarForever | 1077. Travelling Tours | 13 Oct 2022 14:57 | 6 | let N be the node num of the graph. so why the maximum cycle number is M-N+1? where M is the edge num. please... o, sorry, I made a mistake... The correct formula is M-N+K, where K is the number of connected components of given graph. Why is not the question, if you know algo of building all these cycles... Edited by author 13.10.2022 15:00 Edited by author 13.10.2022 15:00 | Clarifications | Tom | 1077. Travelling Tours | 13 Oct 2022 14:15 | 1 | I found the problem statement a little hard to understand, and I want to make some clarifications for anyone who is having difficulties. 1. We are looking for the maximum number of cycles such that each of these chosen cycles has at least one edge which is not included in any other chosen cycle. 2. The graph is not necessarily connected. I originally thought that we had to choose the maximum number of cycles which have at least one edge not included in all other chosen cycles. Hope this can help people. | Statement | P_Nyagolov | 1077. Travelling Tours | 29 Jun 2016 19:02 | 1 | | Weak tests | LeBron [Lviv NU] | 1077. Travelling Tours | 26 Apr 2013 05:37 | 1 | One of my AC solutions will crash on test 200 3 1 200 200 199 199 1 and on many other like this one. (I'm never using vertex #200 in this solution) | All with WA #1 | morbidel | 1077. Travelling Tours | 16 Mar 2012 04:22 | 3 | I got WA1 so I made some debug and discovered that test 1 has N = 136 (with lines like if (N == 136) while(1); The problem with code was that I was using char instead of unsigned char :) Check this test: 136 6 130 132 136 135 135 130 130 133 133 134 133 135 One good answer should be 1 3 130 133 135 4 5 1 2 2 3 3 4 4 1 2 4 My wa #1: 3 4 1 2 3 4 3 2 1 4 3 4 3 2 Each of these T tours has at least a road that does not belong to (T−1) other tours. Edited by author 16.03.2012 04:22 Edited by author 17.03.2012 02:34 Edited by author 17.03.2012 02:35 | Could anyone give me some tests? | lingwei | 1077. Travelling Tours | 18 Jul 2011 13:39 | 2 | Edited by author 24.10.2004 08:18 Edited by author 24.10.2004 08:19 9 12 9 4 4 8 8 7 7 9 9 5 5 2 2 6 6 8 4 3 3 2 2 1 1 7 here four cycles 5 8 1 2 2 3 3 4 1 4 2 5 5 4 1 5 5 3 also four cycles | I WA on 1st test!!!WHY?! | zhuaiyaa | 1077. Travelling Tours | 28 Nov 2010 18:02 | 1 | My answer for the sample is 3 3 1 4 2 3 2 3 4 4 1 3 4 2 or 3 3 1 4 2 4 1 3 4 2 3 2 3 4 Can anyone give me the 1st test? | why WA#1? | ile | 1077. Travelling Tours | 28 Nov 2010 17:00 | 3 | I have no idea what's wrong... I am using DFS (something like euler-cycle detection); checking for self-loop edges; output format is right, tho it returns little bit different for sample test: 3 3 1 2 4 4 1 2 4 3 3 2 4 3 Please, any ideas about wa#1? oh, i forgot to add that i am doing dfs for every connected component separately! Edited by author 15.06.2010 03:05 I did that too,my answer is completely the same as yours,and I WA on the 1st test too | I use greedy method to choose loop in the order of DFS.But I've just found a peculiar test case that DFS will be incorrect.Is greedy method right here? | Huang Yizheng | 1077. Travelling Tours | 17 Oct 2010 13:10 | 4 | For example: 7 10 1 2 2 3 2 4 2 5 3 5 4 5 5 6 5 7 6 7 1 7 At first the DFS procedure find the loop: (1,2,3,5,6,7,1),then it'll find (1,2,3,5,7,1). and next,no loop with unused edge will be found!?! In fact,the maximum T is 3(it's obvious),but use greedy method + DFS the number of T only reach 2. Unless we regulated the order of search (it means DFS can't be right!),otherwise we have to delete a found loop to let more loop to have unused edge,then how to make the regulations? Sorry, for this example, the correct output is T = 4 !!! Check your algorithm again !!! mailto : trungduck@yahoo.com > For example: > 7 10 > 1 2 > 2 3 > 2 4 > 2 5 > 3 5 > 4 5 > 5 6 > 5 7 > 6 7 > 1 7 > At first the DFS procedure find the loop: > (1,2,3,5,6,7,1),then it'll find (1,2,3,5,7,1). > and next,no loop with unused edge will be found!?! > In fact,the maximum T is 3(it's obvious),but use greedy > method + DFS the number of T only reach 2. > Unless we regulated the order of search > (it means DFS can't be right!),otherwise we have to > delete a found loop to let more loop to have unused > edge,then how to make the regulations? > > Once DFS loop is found, it ALWAYS contains unused edge - e.g. the edge which looped it in :) Edited by author 17.10.2010 13:22 Edited by author 17.10.2010 13:22 | WA2 | remdy21 | 1077. Travelling Tours | 29 Jul 2010 19:59 | 1 | WA2 remdy21 29 Jul 2010 19:59 why WA2?? program ural; var n,a,b,y:byte; m,i,z,r:integer; h,g:array[1..200]of integer; t:array[1..32767]of byte; l:array[1..32767]of integer; p,q:array[1..32767]of boolean; s:array[1..200]of byte; k:array[1..400]of integer; o:array[1..400]of byte; u:array[1..200]of boolean; x:boolean; procedure search(d:byte); var r:integer; begin u[d]:=true; r:=h[d]; while r<>0 do begin if u[t[r]]=false then begin inc(y); k[y]:=g[d]; g[d]:=y; o[y]:=t[r]; inc(y); k[y]:=g[t[r]]; g[t[r]]:=y; o[y]:=d; p[r]:=true; if q[r] then p[r+1]:=true else p[r-1]:=true; search(t[r]); end; r:=l[r]; end; end; procedure track(v,d:byte); var r:byte; begin if d=i then begin write(v,' '); for r:=1 to v-1 do write(s[r],' '); writeln(d); x:=true; exit; end; u[d]:=true; s[v]:=d; r:=g[d]; while r<>0 do begin if u[o[r]]=false then track(v+1,o[r]); if x then exit; r:=k[r]; end; end; begin assign(input,'travel.in'); assign(output,'travel.out'); reset(input); rewrite(output); readln(n,m); for i:=1 to m do begin readln(a,b); inc(r); l[r]:=h[a]; h[a]:=r; t[r]:=b; q[r]:=true; inc(r); l[r]:=h[b]; h[b]:=r; t[r]:=a; end; z:=m-n; for i:=1 to n do if u[i]=false then begin inc(z); search(i); end; if z<=0 then begin writeln(0); exit; end else writeln(z); for i:=1 to n do begin r:=h[i]; while r<>0 do begin if(q[r])and(p[r]=false)then begin x:=false; fillchar(u,sizeof(u),false); track(1,t[r]); end; r:=l[r]; end; end; end. | is this output right for the sample input? | namiheike | 1077. Travelling Tours | 10 Feb 2010 15:51 | 3 | My friend,I got AC. Maybe you should find connected components at first | What is the best time and memory of this problem(I solved it)? | Nemets Ilya | 1077. Travelling Tours | 2 Aug 2008 00:09 | 2 | Something like O(M) for memory and something like O(N*M) for time. Actually, it's size of the output :) | WA#7 | Loky_Yuri [USTU] | 1077. Travelling Tours | 28 Aug 2007 22:17 | 4 | WA#7 Loky_Yuri [USTU] 24 Aug 2007 15:58 I wrote this program and think this is right. But I have WA#7. I tested my program by many my own test. And it gives correct answer in 100% cases. May be someone can give me a test. This is my prog: [Code deleted by author] Edited by author 28.08.2007 22:14 Re: WA#7 Loky_Yuri [USTU] 25 Aug 2007 11:15 I'm still waiting for your help... Re: WA#7 AlexF [USTU Frogs] 28 Aug 2007 17:41 My friend, you should be more attentive)) 200 * 200 is much more bigger then 5000)) And please delete your AC code)) Edited by author 28.08.2007 22:43 Re: WA#7 Loky_Yuri [USTU] 28 Aug 2007 22:17 | I can't get problem, please help! | Igor Y. Ludov | 1077. Travelling Tours | 5 Jan 2007 03:56 | 2 | Does every tour always passes through the first city? There said, that it starts and ends in T1. Every tour in sample starts and ends in 1st vertice. So T1 = 1 or not? No. T1 is not always equal to 1. | WHY WA ON FIRST TEST??? ANYBODY COULD TELL ME WHERE IS A TRICK??? | hey, dude! | 1077. Travelling Tours | 4 Apr 2005 12:35 | 4 | Why so simple problem have so small percent of accepted??? Is there bad test? Or there is some nasty trick? Here is my code: var a : array [1..200,1..200] of byte; b,u,now : array [1..200] of boolean; p,c : array [1..200] of byte; v,i,j,n,m,x,y,t,r,k : longint; procedure vvod; begin read(n,m); for i := 1 to m do begin read(x,y); a[x,y] := 1; a[y,x] := 1; end; x := 0; fillchar(b,sizeof(b),true); fillchar(now,sizeof(now),true); end; procedure dfs(x : byte); var i : byte; begin now[x] := false; for i := 1 to n do if now[i] and (a[x,i] = 1) then begin p[i] := x; dfs(i); end; end; procedure cycle; begin inc(t); k := 0; fillchar(u,sizeof(u),true); x := i; while (x <> 0) do begin u[x] := false; x := p[x]; end; x := j; while (x <> 0) do begin inc(k); c[k] := x; if not(u[x]) then begin break; r := k; end; u[x] := false; x := p[x]; end; y := i; while (y <> 0) and (y <> x) do begin inc(k); c[k] := x; x := p[x]; end; end; procedure find; begin for v := 1 to n do if now[v] then begin dfs(v); inc(x); end; writeln(m-n+x); for v := 1 to n do if b[v] then begin fillchar(now,sizeof(now),true); dfs(v); for i := 1 to n-1 do for j := i+1 to n do if not((p[i] = j) or (p[j] = i)) then begin if (a[i,j] = 1) and not(now[i]) and not(now[j]) then begin cycle; write(k); for x := 1 to r do write(' ',c[x]); for x := k downto r+1 do write(' ',c[x]); writeln; end; end; for i := 1 to n do if not(now[i]) then b[i] := false; end; end; begin vvod; find; end. 3 3 1 2 2 2 3 1 Your program outputs: 1 It is NOT right, but I'm not sure that input is correct :) Anybody who have got AC - how did you manage with it ??? Please, give me an interecting test! My new code (nothing new - only check for edges (x - x) : var a : array [1..200,1..200] of byte; b,u,now : array [1..200] of boolean; p,c : array [1..200] of byte; v,i,j,n,m,x,y,t,r,k : longint; procedure vvod; begin read(n,m); for i := 1 to m do begin read(x,y); if (x <> y) then begin a[x,y] := 1; a[y,x] := 1; end else inc(k); end; x := 0; fillchar(b,sizeof(b),true); fillchar(now,sizeof(now),true); end; procedure dfs(x : byte); var i : byte; begin now[x] := false; for i := 1 to n do if now[i] and (a[x,i] = 1) then begin p[i] := x; dfs(i); end; end; procedure cycle; begin inc(t); k := 0; fillchar(u,sizeof(u),true); x := i; while (x <> 0) do begin u[x] := false; x := p[x]; end; x := j; while (x <> 0) do begin inc(k); c[k] := x; if not(u[x]) then begin break; r := k; end; u[x] := false; x := p[x]; end; y := i; while (y <> 0) and (y <> x) do begin inc(k); c[k] := x; x := p[x]; end; end; procedure find; begin for v := 1 to n do if now[v] then begin dfs(v); inc(x); end; writeln(m-n+x-k); for v := 1 to n do if b[v] then begin fillchar(now,sizeof(now),true); dfs(v); for i := 1 to n-1 do for j := i+1 to n do if not((p[i] = j) or (p[j] = i)) then begin if (a[i,j] = 1) and not(now[i]) and not(now[j]) then begin cycle; write(k); for x := 1 to r do write(' ',c[x]); for x := k downto r+1 do write(' ',c[x]); writeln; end; end; for i := 1 to n do if not(now[i]) then b[i] := false; end; end; begin vvod; find; end. My prog have failed on a test like this : 9 10 1 2 1 3 2 3 4 5 4 6 5 6 7 8 7 9 8 9 1 9 How stupid mistake I made!!! But now I have AC =) | WA TEST 1??????????(isn't it the example??) | marius dumitran | 1077. Travelling Tours | 14 May 2004 02:54 | 2 | my result is 3 3 1 2 4 4 1 2 4 3 3 2 4 3 with distinct roads 4 1 3 1 3 2 why wa? did i understand something wrong? Edited by author 13.05.2004 20:15 bai Marius, da-mi si mie id-ul tau pe Yahoo MSN si mailul pe Hotmail sa te pun in lista, poate mai vorbim mailul meu e: ste_fanus@k.ro, ste_fanus@hotmail.com si pe yahoo e morbidel108 | What's wrong with this problem? I always get WA even when I tried some of the solutions offered in the forum | Anton R. Dimitrov | 1077. Travelling Tours | 16 Aug 2003 19:27 | 1 | My solution is : #include <stdio.h> #define MAX 205 #define INF 2000000000 int n,m; int nasl[MAX][MAX]; int brn[MAX]; int vis[MAX]; int par[MAX]; int tree[MAX][MAX]; //short used[MAX][MAX]; int matr[MAX][MAX]; int brc; //short cycles[MAX*MAX][3]; // nachalo, kraj, naj-malko izpolzvanoto rebro int from,toFind; int count; int bri,bri2; int li[MAX*MAX],li2[MAX*MAX]; void DFS(int num) { int i; vis[num] = 1; for(i=0;i<brn[num];i++) { if(!vis[nasl[num][i]]) { tree[num][nasl[num][i]] = 1; tree[nasl[num][i]][num] = 1; par[nasl[num][i]] = num; DFS(nasl[num][i]); } } } void DFSW() { int i; for(i=0;i<n;i++) if(!vis[i]) { par[i] = -1; DFS(i); } } int main() { int i,i2,i3,cur; int a1,a2; // freopen("1077.in","r",stdin); scanf("%d %d",&n,&m); for(i=0;i<=n;i++) { vis[i] = 0; brn[i] = 0; for(i2=0;i2<n;i2++) { tree[i][i2] = 0; } } for(i=0;i<m;i++) { scanf("%d %d",&a1,&a2); nasl[a1-1][brn[a1-1]++] = a2-1; nasl[a2-1][brn[a2-1]++] = a1-1; matr[a1-1][a2-1] = matr[a2-1][a1-1] = 1; } DFSW(); // DFS(0); count = 0; for(i=0;i<n;i++) for(i2=i+1;i2<n;i2++) if(matr[i][i2]==1 && tree[i][i2]==0) count++; printf("%d\n",count); for(i=0;i<n;i++) for(i2=i+1;i2<n;i2++) if(matr[i][i2]==1 && tree[i][i2]==0) { bri = 0; bri2 = 0; cur = i; while(cur!=-1) { li[bri++] = cur; cur = par[cur]; } cur = i2; while(cur!=-1) { li2[bri2++] = cur; cur = par[cur]; } bri--; bri2--; while(li[bri]==li2[bri2]) { bri--; bri2--; } printf("%d ",bri+2+bri2+1); for(i3=0;i3<=bri+1;i3++) printf("%d ",li[i3]+1); for(i3=bri2;i3>=0;i3--) printf("%d ",li2[i3]+1); printf("\n"); } return 0; } | Why I got wrong answer? Please help me! | Grebnov Ilya[ISPU] | 1077. Travelling Tours | 11 Apr 2003 22:54 | 2 | CONST NMax = 250; VAR Route : ARRAY[1..NMax, 1..NMax] OF LongInt; Used : ARRAY[1..NMax] OF Boolean; Path : ARRAY[0..NMax] OF Integer; N, M, I, T, H, Count : LongInt; Found : Boolean; PROCEDURE DSF(Start, C : LongInt); VAR I : LongInt; BEGIN Used[C] := True; IF (Route[C, Start] = 2) THEN BEGIN Found := True; Used[C] := False; Exit; END; FOR I := 1 TO N DO IF (NOT Used[I]) AND (Route[C, I] = 2) THEN BEGIN Route[C, I] := 0; Route[I, C] := 0; DSF(Start, I); Route[C, I] := 2; Route[I, C] := 2; IF Found THEN Break; END; IF (NOT Found) THEN IF (Route[C, Start] = 1) THEN BEGIN Route[Start, C] := 2; Route[C, Start] := 2; Found := True; END; IF NOT Found THEN FOR I := 1 TO N DO IF (NOT Used[I]) AND (Route[C, I] = 1) THEN BEGIN Route[C, I] := 0; Route[I, C] := 0; DSF(Start, I); IF Found THEN BEGIN Route[C, I] := 2; Route[I, C] := 2; Break; END ELSE BEGIN Route[C, I] := 1; Route[I, C] := 1; END; END; Used[C] := False; END; PROCEDURE DSF2(Start, C, Size : LongInt); VAR I : LongInt; BEGIN Used[C] := True; IF (Route[C, Start] = 1) THEN BEGIN Found := True; Used[C] := False; Path[Size] := C; Path[0] := Size; Exit; END; FOR I := 1 TO N DO IF (NOT Used[I]) AND (Route[C, I] = 1) THEN BEGIN Route[C, I] := 0; Route[I, C] := 0; DSF2(Start, I, Size+1); Route[C, I] := 1; Route[I, C] := 1; IF Found THEN BEGIN Path[Size] := C; Break; END; END; IF (NOT Found) THEN IF (Route[C, Start] = 2) THEN BEGIN Route[Start, C] := 1; Route[C, Start] := 1; Path[Size] := C; Path[0] := Size; Found := True; END; IF NOT Found THEN FOR I := 1 TO N DO IF (NOT Used[I]) AND (Route[C, I] = 2) THEN BEGIN Route[C, I] := 0; Route[I, C] := 0; DSF2(Start, I, Size+1); IF Found THEN BEGIN Route[C, I] := 1; Route[I, C] := 1; Path[Size] := C; Break; END ELSE BEGIN Route[C, I] := 2; Route[I, C] := 2; END; END; Used[C] := False; END; BEGIN FillChar(Route, SizeOf(Route), 0); FillChar(Used, SizeOf(Used), False); ReadLn(N, M); FOR I := 1 TO M DO BEGIN ReadLn(T, H); Route[T, H] := 1; Route[H, T] := 1; END; Count := 0; FOR T := 1 TO N DO FOR H := 1 TO N DO IF Route[T, H] = 1 THEN BEGIN Used[T] := True; Route[T, H] := 0; Route[H, T] := 0; Found := False; DSF(T, H); IF Found THEN BEGIN Route[T, H] := 2; Route[H, T] := 2; Inc(Count); END ELSE BEGIN Route[T, H] := 1; Route[H, T] := 1; END; Used[T] := False; END; WriteLn(Count); IF Count <> 0 THEN BEGIN FOR T := 1 TO N DO FOR H := 1 TO N DO IF Route[T, H] = 2 THEN BEGIN Used[T] := True; Route[T, H] := 0; Route[H, T] := 0; Found := False;
| Can anyone help me or give me some tests? | train | 1077. Travelling Tours | 30 Oct 2002 12:14 | 1 | I think my method is right, but it always gets WR! Thank u! #include "stdio.h" int n, m, M[201][201]; int B[201][2], F[201]; void Init() { int i, j, k;
scanf("%d %d",&n,&m); for (i=1; i<=n; i++) for (j=1; j<=n; j++) M[i][j] = 0; for (k=0; k<m; k++) { scanf("%d %d",&i,&j); if (i!=j) M[i][j] = M[j][i] = 1; } } void CT(int num, int father, int level) { int i; F[num] = 1; B[num][0] = father; B[num][1] = level; for (i=1; i<=n; i++) if (!F[i] && M[num][i]) { M[num][i] = M[i][num] = 0; CT(i, num, level+1); } } void CreateTree() { int i;
for (i=1; i<=n; i++) F[i] = 0; /* for (i=1; i<=n; i++) if (!F[i]) { Pth[0] = i; nail = head = 0; B[i][0] = 0; B[i][1] = 1; F[i] = 1; while (head<=nail) { j = Pth[head]; head++; for (k=1; k<=n; k++) if (!F[k] && M[j][k]) { nail++; Pth[nail] = k; B[k][0] = j; B[k][1] = B[j][1] + 1; F[k] = 1; M[j][k] = M[k][j] = 0; } } }*/ for (i=1; i<=n; i++) { if (!F[i]) CT(i, 0, 1); } /* for (i=1; i<=n; i++) printf("%d %d\n",B[i][0],B[i][1]);*/ } void Caculate() { int total, i, j; int Pth[2][201], l[2]; for (i=1, total=0; i<=n; i++) for (j=1; j<=n; j++) if (M[i][j]==1) { total++; M[i][j] = M[j][i] = 2; } printf("%d\n",total); for (i=1; i<=n; i++) for (j=1; j<=n; j++) if (M[i][j]==2) { M[i][j] = M[j][i] = 0; l[0] = l[1] = 0; Pth[0][0] = i; Pth[1][0] = j;
while (Pth[0][l[0]]!=Pth[1][l[1]]) if (B[Pth[0][l[0]]][1]==B[Pth [1][l[1]]][1]) { l[0]++; Pth[0][l[0]] = B[Pth[0][l[0]-1]][0]; l[1]++; Pth[1][l[1]] = B[Pth[1][l[1]-1]][0]; } else if (B[Pth[0][l[0]]][1]>B [Pth[1][l[1]]][1]) { l[0]++; Pth[0][l[0]] = B[Pth[0][l[0]-1]][0]; } else { l[1]++; Pth[1][l[1]] = B[Pth[1][l[1]-1]][0]; } printf("%d",l[0]+l[1]+1); for (i=0; i<=l[0]; i++) printf(" % d",Pth[0][i]); for (i=l[1]-1; i>=0; i--) printf(" % d",Pth[1][i]); printf("\n"); } } main() { Init(); CreateTree(); Caculate(); } |
|
|