您的位置:首页 > 其它

CodeVs 2833 奇怪的梦境

2014-10-30 20:59 211 查看
思路 : 判断拓扑排序中是否有环,以及最终入度不为零的点有几个

从总数n中,每找到一个入度为零的点,n--,判断最终n的值即可。开始时候T了,竟然是因为边数组开小了。。。。为何不是RE啊!!!

AC代码

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
#include<queue>
#include<set>
#define pi acos(-1.0)
#define eps 1e-8
typedef long long ll;
using namespace std;
const int maxn=10005;
int in[maxn],vis[maxn],head[maxn],cnt,tot,n;
queue <int > q;
struct edge
{
    int v,next;
} E[3*maxn];
void init()
{
    cnt=0;
    memset(vis,0,sizeof(vis));
    memset(in,0,sizeof(in));
    memset(head,-1,sizeof(head));

}
void add_edge(int u,int v)
{
    E[cnt].v=v;
    E[cnt].next=head[u];
    head[u]=cnt++;
}
void toposort()
{
    int i,j,k;
    for(i=1; i<=n; i++)
        if(in[i]==0) q.push(i),in[i]--;
    while(!q.empty())
    {
        int j=q.front();
        q.pop();
        for(int k=head[j]; k!=-1; k=E[k].next)
        {
            int tmp=E[k].v;
            in[tmp]--;
            if(in[tmp]==0) q.push(tmp),in[tmp]--;
        }
        tot--;

    }
}

int main()
{
    init();
    int i,m,u,v;
    scanf("%d%d",&n,&m);
    for(i=0; i<m; i++)
    {
        scanf("%d%d",&u,&v);
        add_edge(u,v);
        in[v]++;
    }
    tot=n;
    toposort();
    if(tot==0) printf("o(∩_∩)o\n");
    else printf("T_T\n%d\n",tot);
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: