1 条题解

  • 0
    @ 2025-10-8 17:02:58
    #include <bits/stdc++.h> 
    using namespace std;
    const int N=1e5+10;
    vector<int> G[N];
    int n,m;
    int fa[N],ok,t;
    bool vis[N];
    void dfs(int x,int xfa,int &t)
    {
    	vis[x]=1;
    	for(int y:G[x])if(y!=xfa)
    	{
    		int tt=t;
    		if(vis[y])
    		{
    			ok=1;
    			if(t==0)t=1;//当前联通块未返祖,否则不管这条边 
    		}
    		else
    		{
    			fa[y]=x;
    			dfs(y,x,t);
    		}
    		if(tt!=t)fa[x]=y;//凡是进去前后t不一样的都要把边反向
    	}
    }
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1,x,y;i<=m;++i)
    	{
    		scanf("%d%d",&x,&y);
    		G[x].push_back(y);
    		G[y].push_back(x);
    	}
    	memset(vis,0,sizeof(vis));
    	for(int i=1;i<=n;++i)
    	{
    		if(!vis[i])//未走过 
    		{
    			ok=0;t=0;
    			dfs(i,0,t);
    			if(!ok) {printf("NIE\n"); return 0;} 
    		}
    	}
    	printf("TAK\n");
    	for(int i=1;i<=n;++i) printf("%d\n",fa[i]);
    	return 0;
    }
    
    • 1

    信息

    ID
    2769
    时间
    1000ms
    内存
    64MiB
    难度
    8
    标签
    递交数
    16
    已通过
    8
    上传者