得又是八十分
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct ans {
int ans_top;
int list[505];
} ans;
typedef struct message {
int list[505];
int list_top;
int arrivetime;
} message;
typedef struct vertex {
int list[505];
int list_top;
int l;
int r;
message messages[3005];
} vertex;
int n, t;
vertex *vertexs;
ans anss[30005];
int top = 0;
int **graph;
void init() {
int m;
scanf("%d%d", &n, &m);
graph = (int**)malloc(sizeof(int*) * (n + 1));
for (int i = 1; i <= n; ++i) {
graph[i] = (int*)malloc(sizeof(int) * (n + 1));
for (int j = 1; j <= n; ++j) {
graph[i][j] = 0;
}
}
for (int i = 0; i < m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
graph[x][y] = 1;
graph[y][x] = 1;
}
vertexs = (vertex*)malloc(sizeof(vertex) * (n + 1));
for (int i = 1; i <= n; ++i) {
vertexs[i].l = vertexs[i].list_top = vertexs[i].r = 0;
vertexs[i].list[vertexs[i].list_top++] = 0;
for (int j = 0; j < 1005; ++j) {
vertexs[i].messages[j].list_top = vertexs[i].messages[j].arrivetime = 0;
}
}
}
void findans(int vertexnumber) {
memcpy(anss[top].list, vertexs[vertexnumber].list, sizeof(int) * vertexs[vertexnumber].list_top);
anss[top].ans_top = vertexs[vertexnumber].list_top;
++top;
}
void show() {
for (int i = 0; i < top; ++i) {
printf("%d ", anss[i].ans_top);
for (int j = 0; j < anss[i].ans_top; ++j) {
printf("%d ", anss[i].list[j]);
}
printf("\n");
}
}
bool checkandupdate(int vertexnumber, int intime) {
if (vertexs[vertexnumber].r - vertexs[vertexnumber].l >= 1) {
if (intime == vertexs[vertexnumber].messages[vertexs[vertexnumber].l].arrivetime) {
if (vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list_top > vertexs[vertexnumber].list_top) {
memcpy(vertexs[vertexnumber].list, vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list, sizeof(int) * vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list_top);
vertexs[vertexnumber].list_top = vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list_top;
vertexs[vertexnumber].l++;
return true;
} else if (vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list_top == vertexs[vertexnumber].list_top) {
if (vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list[vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list_top - 1] < vertexs[vertexnumber].list[vertexs[vertexnumber].list_top - 1]) {
memcpy(vertexs[vertexnumber].list, vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list, sizeof(int) * vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list_top);
vertexs[vertexnumber].list_top = vertexs[vertexnumber].messages[vertexs[vertexnumber].l].list_top;
vertexs[vertexnumber].l++;
return true;
}
}
vertexs[vertexnumber].l++;
}
}
return false;
}
void sendmessage(int vertexnumber, int nowtime) {
for (int i = 1; i <= n; ++i) {
if (graph[vertexnumber][i]) {
if (vertexs[i].r - vertexs[i].l == 0) {
++vertexs[i].r;
} else if (vertexs[i].r - vertexs[i].l > 0 && vertexs[i].messages[vertexs[i].r - 1].arrivetime == nowtime + t) {
if (vertexs[i].messages[vertexs[i].r - 1].list_top > vertexs[vertexnumber].list_top) {
continue;
} else if (vertexs[i].messages[vertexs[i].r - 1].list_top == vertexs[vertexnumber].list_top && vertexs[i].messages[vertexs[i].r - 1].list[vertexs[i].messages[vertexs[i].r - 1].list_top - 1] < vertexs[vertexnumber].list[vertexs[vertexnumber].list_top - 1]) {
continue;
}
} else if (vertexs[i].r - vertexs[i].l > 0 && vertexs[i].messages[vertexs[i].r - 1].arrivetime != nowtime + t) {
++vertexs[i].r;
}
vertexs[i].messages[vertexs[i].r - 1] = vertexs[i].messages[vertexs[i].r - 1];
memcpy(vertexs[i].messages[vertexs[i].r - 1].list, vertexs[vertexnumber].list, sizeof(int) * vertexs[vertexnumber].list_top);
vertexs[i].messages[vertexs[i].r - 1].list_top = vertexs[vertexnumber].list_top;
vertexs[i].messages[vertexs[i].r - 1].arrivetime = nowtime + t;
}
}
}
int main() {
init();
int s, nowtime = 0;
scanf("%d%d", &t, &s);
for (int i = 0; i < s; ++i) {
int vertexnumber, intime, productnumber, sign;
scanf("%d%d", &vertexnumber, &intime);
char temp = getchar();
if (temp == ' ') {
scanf("%d", &productnumber);
sign = 0;
} else {
sign = 1;
}
while (nowtime != intime) {
++nowtime;
for (int i = 1; i <= n; ++i) {
if (checkandupdate(i, nowtime)) {
sendmessage(i, nowtime);
}
}
}
if (sign == 0) {
vertexs[vertexnumber].list[vertexs[vertexnumber].list_top++] = productnumber;
sendmessage(vertexnumber, intime);
} else {
findans(vertexnumber);
}
}
show();
return 0;
}