#5
by FISH » 8年前
こんな感じでしょうか。
自分の環境では実行はできましたが動作が停止してしまいました。
VMにlinuxいれて動かしてみようと思います。
コード:
#include <stdio.h> // fopen, fclose, fgets, sscanf, printf, putchar
#include <stdlib.h> // malloc, free
#define SIZE 10000
int size;
int *paths[SIZE];
int path[SIZE];
int cur_size, longest_size;
int route[SIZE], longest_route[SIZE];
int used[SIZE];
char buf[SIZE * 5];
void step(int i){
int i,j,k;
if (used[i]) return;
used[i] = 1;
route[cur_size++] = i;
for ( j = 1; j <= paths[i][0]; j++) {
step(paths[i][j]);
if (cur_size > longest_size) {
longest_size = cur_size;
for ( k = 0; k < cur_size; k++)
longest_route[k] = route[k];
}
}
cur_size--;
used[i] = 0;
}
int main(void){
int i,j,k, n;
char *p = buf;
FILE *fp = fopen("graph.txt", "r");
if (!fp) return 1;
fgets(buf, sizeof buf, fp); // skip a comment line
if (!fgets(buf, sizeof buf, fp)) return 2;
if (sscanf(buf, "%d", &size) != 1 || size > SIZE) return 3;
for ( i = 0; i < size; i++) {
if (!fgets(buf, sizeof buf, fp)) return 4;
for (k = 0; sscanf(p, "%d%n", path + k, &n) == 1; k++)
p += n;
paths[i] = malloc((k+1) * sizeof(int));
if (!paths[i]) return 5;
paths[i][0] = k;
for ( j = 0; j < k; j++)
paths[i][j+1] = path[j];
}
fclose(fp);
for ( i = 0; i < size; i++)
step(i);
for ( i = 0; i < longest_size; i++)
printf("%d\n", longest_route[i]);
for ( i = 0; i < size; i++)
free(paths[i]);
}
こんな感じでしょうか。
自分の環境では実行はできましたが動作が停止してしまいました。
VMにlinuxいれて動かしてみようと思います。
[code]
#include <stdio.h> // fopen, fclose, fgets, sscanf, printf, putchar
#include <stdlib.h> // malloc, free
#define SIZE 10000
int size;
int *paths[SIZE];
int path[SIZE];
int cur_size, longest_size;
int route[SIZE], longest_route[SIZE];
int used[SIZE];
char buf[SIZE * 5];
void step(int i){
int i,j,k;
if (used[i]) return;
used[i] = 1;
route[cur_size++] = i;
for ( j = 1; j <= paths[i][0]; j++) {
step(paths[i][j]);
if (cur_size > longest_size) {
longest_size = cur_size;
for ( k = 0; k < cur_size; k++)
longest_route[k] = route[k];
}
}
cur_size--;
used[i] = 0;
}
int main(void){
int i,j,k, n;
char *p = buf;
FILE *fp = fopen("graph.txt", "r");
if (!fp) return 1;
fgets(buf, sizeof buf, fp); // skip a comment line
if (!fgets(buf, sizeof buf, fp)) return 2;
if (sscanf(buf, "%d", &size) != 1 || size > SIZE) return 3;
for ( i = 0; i < size; i++) {
if (!fgets(buf, sizeof buf, fp)) return 4;
for (k = 0; sscanf(p, "%d%n", path + k, &n) == 1; k++)
p += n;
paths[i] = malloc((k+1) * sizeof(int));
if (!paths[i]) return 5;
paths[i][0] = k;
for ( j = 0; j < k; j++)
paths[i][j+1] = path[j];
}
fclose(fp);
for ( i = 0; i < size; i++)
step(i);
for ( i = 0; i < longest_size; i++)
printf("%d\n", longest_route[i]);
for ( i = 0; i < size; i++)
free(paths[i]);
}[/code]