1. 程式人生 > >UOJ UR#9 App管理器

UOJ UR#9 App管理器

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管理器