http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4352
有题解给的是动态树 http://hi.baidu.com/xpycc/item/0e5b0feb827e203a86d9de92
自己一顿乱搞,双向链表 。
#include <cstdio> #include <iostream> #include <cstring> #include <map> #include <string> #include <algorithm> #include <map> #include <queue> using namespace std; const int inf = 0x7fffffff; const int maxm=50000+123; const int maxn=555; struct Edge{ int v, next, pre; }edge[maxm<<2]; int cnt, head[maxn]; int Map[maxn][maxn]; int D[maxn][maxn];/// char ops[maxm]; int x[maxm], y[maxm]; void addedge(int u, int v) { edge[cnt].v=v; edge[cnt].next=head[u]; edge[cnt].pre=-1; if(~head[u])edge[head[u]].pre=cnt; Map[u][v]=cnt; head[u]=cnt++; edge[cnt].v=u; edge[cnt].next=head[v]; edge[cnt].pre=-1; if(~head[v])edge[head[v]].pre=cnt; Map[v][u]=cnt; head[v]=cnt++; } void deledge(int u, int v) { int p1=Map[u][v], p2=Map[v][u]; if(p1 == -1 || p2 == -1) return;///边已经不存在了 Map[u][v]=Map[v][u]=-1; if(~edge[p1].pre)edge[edge[p1].pre].next=edge[p1].next; else head[u]=edge[p1].next; if(~edge[p1].next)edge[edge[p1].next].pre=edge[p1].pre; if(~edge[p2].pre)edge[edge[p2].pre].next=edge[p2].next; else head[v]=edge[p2].next; if(~edge[p2].next)edge[edge[p2].next].pre=edge[p2].pre; } void init(int n) { cnt=0; memset (head, -1, sizeof(int)*(n+5)); memset (Map, -1, sizeof(Map)); for (int i=0; i<=n; ++i) for (int j=0; j<=n; ++j) D[i][j]=inf; } void debug(int n) { for (int i=1; i<=n; ++i) { printf("%d:", i); for (int p=head[i]; ~p; p=edge[p].next) { printf("->v=%d", edge[p].v); } puts(""); } } bool dfs(int u, int fa, int &dm, const int &to) { //printf("%d %d\n", u, fa); if(u==to)return true; for (int p=head[u]; ~p; p=edge[p].next) { if(edge[p].v==fa)continue; if(dfs(edge[p].v, u, dm, to)) { dm=min(dm, D[u][edge[p].v]); return true; } } return false; } int main () { int n, m; int T=0; while (~scanf("%d%d", &n, &m)) { init(n); if(T)puts(""); printf("Case %d:\n", ++T); for (int i=0; i<m; ++i) { scanf("%s %d %d", ops+i, x+i, y+i); if(ops[i]=='D') { D[x[i]][y[i]]=D[y[i]][x[i]]=i; } } for (int i=0; i<m; ++i) { if(ops[i]=='I') { int dm=inf; if(dfs(x[i], -1, dm, y[i])) { if(dm<D[x[i]][y[i]]) { addedge(x[i], y[i]); deledge(x[dm], y[dm]); } } else addedge(x[i], y[i]); } if(ops[i]=='D' ) { deledge(x[i], y[i]); } if(ops[i]=='Q') { int dm=inf; puts(dfs(x[i], -1, dm, y[i])?"YES":"NO"); } // printf("op: %d %c %d %d\n", i, ops[i], x[i], y[i]); // debug(n); } } return 0; } /* 5 9 I 1 2 I 2 3 Q 1 3 I 2 4 I 1 3 I 4 5 D 1 2 D 2 3 Q 1 5 5 10 I 1 2 I 2 3 Q 1 3 I 1 3 I 2 4 I 4 5 D 1 2 D 2 3 Q 1 5 Q 2 4 3 6 I 1 2 I 2 3 I 3 1 D 1 2 D 2 3 Q 1 2 */