1.图的存储
/* 我们一般还是选用链式前向星存储,如果用vector存储要注意g.size()-1可能会减成一个负数,如果要对一条无向边搞一些记录只需要存储一个id就行了 */ struct edge{ int v; int nxt; ll w; }e[maxn]; void ins(int u,int v,ll w){ cnt++; e[cnt].v = v; e[cnt].w = w; e[cnt].nxt = head[u]; head[u] = cnt; } for(int i = head[x];i;i = e[i].nxt){ //搞一些事情 }
2.二分图染色
http://www.cnblogs.com/wenruo/p/5243034.html
bool dfs(int x,int c){ col[x] = c; int to; for(int i = 0;i < g[x].size();i++){ to = g[x][i]; if(col[to] == c) return false; if(!col[to] && !dfs(to,3-c)) return false; } return true; } void get_ans(){ for(int i = 1;i <= n;i++){ if(!col[i]){ if(!dfs(i,1)){ printf("NO\n"); return; } } } printf("YES\n"); }