UOJ UR#9 App管理器
阿新 • • 發佈:2018-04-15
using tar nod 傳送門 ont 是否 直接 tdi code
題目傳送門
題目大意大概就是給你一個混合圖(既有有向邊又有無向邊),對於每條無向邊,u-v,問刪去u->v,或刪去v->u那條可以使新圖強連通。(保證數據有解)。
這道題前幾個數據點送分。
枚舉每一條邊,先將它去掉,遍歷圖,如果可以達到所有點,即強連通。
比如去掉u->v,其實只要dfs(u),判斷是否能到達v即可。
可以直接刪去,否則刪另一條邊,刪去後因為圖強連通,所以對之後的操作無影響。
code:
#include <cstdio> #include <cstring> using namespace std; int read() {char c;while(c=getchar(),c<‘0‘||c>‘9‘); int x=c-‘0‘;while(c=getchar(),c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘; return x; } const int MAXN=5005; int N,M,ide[MAXN<<1],vis[MAXN]; int head[MAXN],to[MAXN<<1],nxt[MAXN<<1],cnt; struct node{ int x,y,o,d; }edge[MAXN];void add(int x,int y) { to[cnt]=y; nxt[cnt]=head[x]; head[x]=cnt; cnt++; } void dfs(int now) { vis[now]=1; for(int i=head[now];i!=-1;i=nxt[i]){ if(!ide[i]&&!vis[to[i]]){ dfs(to[i]); } } } int main() { N=read(),M=read(); memset(head,-1,sizeof head); for(int i=1;i<=M;i++){ int x=read(),y=read(),o=read(); add(x,y);if(!o)add(y,x); edge[i]=(node){x,y,o,cnt-1}; } for(int i=1;i<=M;i++){ if(edge[i].o){puts("0");continue;} memset(vis,0,sizeof vis); ide[edge[i].d]=1; dfs(edge[i].y); if(vis[edge[i].x]){ puts("0");continue; } else{ ide[edge[i].d]=0; ide[edge[i].d-1]=1; } puts("1");continue; } return 0; }
UOJ UR#9 App管理器