• 【POJ2230】Watchcow


    题目大意:给定一个 N 个点,M 条边的无向图,要求不重复地经过每条边两次,并且从 1 号节点出发最后回到 1 号节点,求一条路径。

    题解:不重复地经过两次这个操作很容易地通过无向图的建边方式来实现,在欧拉回路的 dfs 过程中只需要每次将当前边标记访问过即可。同样,一个点所有边访问结束之后再入栈,最后倒序输出结果即是一组答案。

    代码如下

    #include <cstdio>
    #include <utility>
    #include <cstring>
    #include <ctype.h>
    #include <stack>
    #define fi first
    #define se second
    #define pb push_back
    #define mp make_pair
    #define all(x) x.begin(),x.end()
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> P;
    const int mod=1e9+7;
    const int inf=0x3f3f3f3f;
    const int maxv=1e4+10;
    const int maxe=5e4+10;
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline ll sqr(ll x){return x*x;}
    inline ll read(){
    	ll x=0,f=1;char ch;
    	do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
    	do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
    	return f*x;
    }
    
    struct node{
    	int nxt,to;
    	node(int x=0,int y=0):nxt(x),to(y){}
    }e[maxe<<1];
    int tot=1,head[maxv];
    inline void add_edge(int from,int to){
    	e[++tot]=node(head[from],to),head[from]=tot;
    }
    
    int n,m,stk[maxe<<1],top;
    bool vis[maxe<<1];
    
    void read_and_parse(){
    	n=read(),m=read();
    	for(int i=1,x,y;i<=m;i++){
    		x=read(),y=read();
    		add_edge(x,y),add_edge(y,x);
    	}
    }
    
    void dfs(int u){
    	for(int i=head[u];i;i=e[i].nxt){
    		int v=e[i].to;
    		if(!vis[i])vis[i]=1,dfs(v);
    	}
    	stk[++top]=u;
    }
    
    void solve(){
    	dfs(1);
    	for(int i=2*m+1;i>=1;i--)printf("%d
    ",stk[i]);
    }
    
    int main(){
    	read_and_parse();
    	solve();
    	return 0;
    }
    
    
  • 相关阅读:
    CSS实现水平居中的5种思路
    html5遵循的5个设计原则
    HTML5标签嵌套规则
    动画animation的三个应用(漂浮的白云、旋转的星球、正方体合成)
    深入理解CSS动画animation
    深入理解CSS径向渐变radial-gradient
    深入理解CSS线性渐变linear-gradient
    动态更新语句,时间精度丢失
    反射类的构造数
    在ASP.NET MVC中使用Grid.mvc
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10629801.html
Copyright © 2020-2023  润新知