コード例 #1
0
ファイル: p3321.cpp プロジェクト: alxsoares/OI
int main()
{
	freopen("t.in", "r", stdin);
	scanf("%d\n", &n);
	for(int i = 1, a, b; i < n; i ++)
	{
		scanf("%d %d\n", &a, &b);
		Add_Edge(a, b);
		Add_Edge(b, a);
	}
	dfs(1);
	for(int i = 1; i <= n; i ++)
		Update(start[i], exist[start[i]] ^= 1);
	scanf("%d\n", &m);
	while(m --)
	{
		char ctrl;
		int x;
		scanf("%c %d\n", &ctrl, &x);
		if(ctrl == 'C')
		{
			int v;
			exist[start[x]] ^= 1;
			if(exist[start[x]]) v = 1;
			else v = -1;
			Update(start[x], v);
		}
		else
			printf("%d\n", Sum(over[x]) - Sum(start[x] - 1));
	}
}
コード例 #2
0
int main()
{
    int m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        char str[3];
        getchar();
        int x,y,c,top=-1;
        memset(vert,0,sizeof(vert));
        while(m--)
        {
            scanf("%s%d%d",str,&x,&y);getchar();
            if(str[0]=='P')
            {
                scanf("%d",&c);getchar();
                Add_Edge(y,x,c,top);
                Add_Edge(x,y,-c,top);
            }
            else    Add_Edge(y,x,1,top);
        }
        if(Spfa())puts("Reliable");
        else puts("Unreliable");
    }
    return 0;
}
コード例 #3
0
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int top=-1;
        memset(vert,0,sizeof(vert));
        while(m--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            Add_Edge(x,y,top);Add_Edge(y,x,top);
        }
        m=0;
        memset(par,-1,sizeof(par));
        memset(color,0,sizeof(color));
        DFS(1,0,1);
        printf("%d\n",Solve());
    }
    return 0;
}
コード例 #4
0
ファイル: 445B.c プロジェクト: NoSoul/CodeForces
int main()
{
    int N, M, i, x, y, Cnt;
    scanf("%d %d", &N, &M);
    Init(N);
    for(i = 0; i < M; ++i) {
        scanf("%d %d", &x, &y);
        --x;
        --y;
        Add_Edge(x, y);
        Add_Edge(y, x);
    }
    for(i = 0; i < N; ++i) {
        if(!Visited[i]) {
            BFS(i);
        }
    }
    printf("%I64d\n", Ans);
    return 0;
}
コード例 #5
0
bool solve(int mid)
{
    top=0;
    memset(vert,0,sizeof(vert));
    memset(r_vert,0,sizeof(r_vert));
    for(int i=0;i<mid;i++)
    {
        Add_Edge(door[i][0],oppo[door[i][1]]);
        Add_Edge(door[i][1],oppo[door[i][0]]);
    }
    memset(v,0,sizeof(v));top=0;
    memset(order,0,sizeof(order));
    for(int i=0;i<2*n;i++)
        if(!v[i])DFS(i);
    memset(v,0,sizeof(v));top=1;
    memset(id,0,sizeof(id));
    for(int i=2*n-1;i>=0;i--)
        if(!v[order[i]]){RG_DFS(order[i]);top++;}
    for(int i=0;i<2*n;i++)
        if(id[i]==id[oppo[i]])return false;
    return true;
}
コード例 #6
0
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        int top=-1;
        memset(in,0,sizeof(in));
        memset(vert,0,sizeof(vert));
        for(int i=1;i<=n;i++)
        {
            int m,x;
            scanf("%d%d",&tim[i],&m);
            in[i]=m;
            for(int j=0;j<m;j++)
            {
                scanf("%d",&x);
                Add_Edge(x,i,top);
            }
        }
        printf("%d\n",topsort());
    }
    return 0;
}
コード例 #7
0
ファイル: p1143_std.cpp プロジェクト: alxsoares/OI
int main()
{
   int m,a,b;
   scanf("%d %d",&n,&m);
   S=0,T=2*n+1;
   for(int i=1;i<=m;i++)
      scanf("%d %d",&a,&b),g[a][b]=true;
   for(int i=1;i<=n;i++)
   {
      Dfs(i),flag[i]=false;
      for(int j=1;j<=n;j++)
         if(flag[j]==true)
            Add_Edge(j+n,i,0),Add_Edge(i,j+n,inf);
      memset(flag,false,sizeof(flag));
   }
   for(int i=1;i<=n;i++)
   {
      Add_Edge(S,i,1),Add_Edge(i,S,0);
      Add_Edge(i,i+n,0),Add_Edge(i+n,i,inf);
      Add_Edge(i+n,T,1),Add_Edge(T,i+n,0);
   }
   printf("%d\n",n-Max_Flow());
   return 0;
}
コード例 #8
0
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        top=-1;
        for(int i=1;i<=n;i++)vert[i]=r_vert[i]=NULL;
        for(int i=1;i<=n;i++)
        {
            int j;
            while(scanf("%d",&j),j) Add_Edge(i,j);
        }
        top=1;
        memset(visit,0,sizeof(visit));
        for(int i=1;i<=n;i++)
            if(!visit[i])DFS(i);
        
        top=0;
        memset(visit,0,sizeof(visit));
        for(int i=n;i>0;i--)
            if(!visit[order[i]]){DFS_RG(order[i]);top++;}
        
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        for(int i=1;i<=n;i++)
            for(edge *p=vert[i];p;p=p->next)
                if(id[i]!=id[p->to])
                    out[id[i]]++,in[id[p->to]]++;
        int m1=0,m2=0,m3=0;
        for(int i=0;i<top;i++)
        {
            if(in[i]==0&&out[i]==0)m3++;
            else if(!in[i])m1++;
            else if(!out[i])m2++;
        }
        printf("%d\n%d\n",m1+m3,m3+(m1>m2?m1:m2));
    }
    return 0;
}
コード例 #9
0
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        m=0;
        int top=-1,maxi=-1,mini=1000000000;
        memset(flag,-1,sizeof(flag));
        memset(vert, 0,sizeof(vert));
        for(int i=0;i<n;i++)
        {
            scanf("%s",str);
            int len=strlen(str);
            int u=(str[0]-'a')*26+str[1]-'a';
            int v=(str[len-2]-'a')*26+str[len-1]-'a';
            if(flag[u]==-1)flag[u]=m++;
            if(flag[v]==-1)flag[v]=m++;
            Add_Edge(flag[u],flag[v],len,top);
            //Add_Edge(flag[v],flag[u],len,top);
            if(len>maxi)maxi=len;
            if(len<mini)mini=len;
        }
        double l=mini,r=maxi,mid;
      //  printf("%d\n",sum);
        while(r-l>1e-4)
        {
            mid=(l+r)/2;
            //printf("try l,r,mid %.2lf %.2lf %.2lf\n",l,r,mid);
            if(Spfa(mid))
                l=mid;
            else r=mid;
            //system("pause");
        }
        if(l==mini)puts("No solution.");
        else printf("%.2lf\n",l);
    }
    return 0;
}
コード例 #10
0
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        m=0;
        int top=-1,sum=0;
        memset(flag,-1,sizeof(flag));
        memset(vert, 0,sizeof(vert));
        for(int i=0;i<n;i++)
        {
            scanf("%s",str);
            int len=strlen(str);
            int u=(str[0]-'a')*26+str[1]-'a';
            int v=(str[len-2]-'a')*26+str[len-1]-'a';
            if(flag[u]==-1)flag[u]=m++;
            if(flag[v]==-1)flag[v]=m++;
            Add_Edge(flag[u],flag[v],len,top);
            //Add_Edge(flag[v],flag[u],len,top);
            sum+=len;
        }
        double l=0,r=sum,mid;
      //  printf("%d\n",sum);
        while(r-l>1e-6)
        {
            mid=(l+r)/2;
            //printf("try l,r,mid %.2lf %.2lf %.2lf\n",l,r,mid);
            if(Spfa(mid))
                l=mid;
            else r=mid;
            //system("pause");
        }
        printf("%.2lf\n",l);
    }
    return 0;
}
コード例 #11
0
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        top=0;
        for(int i=0;i<2*n;i++){r_vert[i]=NULL;vert[i]=NULL;}
        for(int i=0;i<n;i++)
        {
            int a1,a2,b1,b2,c;
            scanf("%d:%d %d:%d %d",&a1,&a2,&b1,&b2,&c);
            a1=a1*60+a2;    b1=b1*60+b2;
            start[zeros(i)]=a1; end[zeros(i)]=a1+c;
            start[ones(i)]=b1-c;    end[ones(i)]=b1;
        }
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                int ii=i<<1,jj=j<<1;
                if(intersect(ii,jj))
                {
                    Add_Edge(ii,jj+1);
                    Add_Edge(jj,ii+1);
                }
                if(intersect(ii,jj+1))
                {
                    Add_Edge(ii,jj);
                    Add_Edge(jj+1,ii+1);
                }
                if(intersect(ii+1,jj))
                {
                    Add_Edge(ii+1,jj+1);
                    Add_Edge(jj,ii);
                }
                if(intersect(ii+1,jj+1))
                {
                    Add_Edge(ii+1,jj);
                    Add_Edge(jj+1,ii);
                }
            }
        }
        top=0;
        memset(v,0,sizeof(v));
        for(int i=0;i<2*n;i++)
            if(!v[i])DFS(i);

        memset(v,0,sizeof(v));
        for(int i=top-1;i>=0;i--)
            if(!v[order[i]])DFS_RG(order[i],order[i]);

        bool flag=false;
        for(int i=0;i<n;i++)
            if(id[zeros(i)]==id[ones(i)]){flag=true;   break;}

        if(flag)    puts("NO");
        else{
            puts("YES");
            Display();
        }
    }
    return 0;
}