CCF第四题无向图打印路径

#include<iostream>
#include<vector>
#include<algorithm>
#include<stack>
#define N 10010
using namespace std;

vector<long int> head[N];
stack<long int> way;
long int n;
bool visited[N][N];
bool vis[N];
long long int d[N];

void addEdge(long int x,long int y) {
    head[x].push_back(y);
    head[y].push_back(x);
    d[x]++;
    d[y]++;
}

void dfs(int u) {
    vis[u]=1;
    vector<long int>::iterator pos;
    for(pos=head[u].begin(); pos!=head[u].end(); pos++) {
        long int v=*pos;
        if(!vis[v]) {
            dfs(v);
        }
    }

}

void euler(long int u) {
    vector<long int>::iterator pos;
    //利用dfs的方法遍历所有的边
    for(pos=head[u].begin(); pos!=head[u].end(); pos++) {
        long int v=*pos;
        if(!visited[u][v]) {
            visited[u][v]=visited[v][u]=1;
            //我这里不用栈,而是在进行下一个点之前就把当前点输出,样例是过了,可是交上去只能得10分
            //cout<<‘ ‘<<v;
            euler(v);
            //用栈的话就没问题,可以得90分。
            way.push(v);
        }
    }
}

int main() {
    long long int m;
    cin>>n>>m ;
    while(m--) {
        long int x,y;
        cin>>x>>y;
        addEdge(x,y);
    }
    //以前总是得90分的原因就是没有考虑图不连通的情况
    //这里从第一个点出发dfs所有的点,最后检验即可
    dfs(1);
    bool flag=0;
    for(int i=1; i<=n; i++)
        if(vis[i]==0) {
            flag=1;
            break;
        }
    //如果是不连通的,直接输出-1
    if(flag==1) cout<<-1;
    else {
        long long int odd_num=0;
        for(long int i=1; i<=n; i++) {
            sort(head[i].begin(),head[i].end());
            if(d[i]%2)
                odd_num++;
        }
        if(odd_num>2)
            cout<<-1;
        else {
            cout<<1;
            euler(1);
            while(!way.empty()) {
                cout<<‘ ‘<<way.top();
                way.pop();
            }
        }
    }

    return 0;
}
时间: 2024-10-13 22:28:49

CCF第四题无向图打印路径的相关文章

leecode第六十四题(最小路径和)

class Solution { public: int minPathSum(vector<vector<int>>& grid) { int m = grid.size(); if (m == 0) return 0; int n = grid[0].size(); if (n == 0) return 0; vector<int> path(n,0); for(int i=m-1;i>=0;i--) { for(int j=n-1;j>=0;j

CodeForces 10D. LCIS 最长公共上升子序列模板题 + 打印路径

推荐一篇炒鸡赞的blog. 下面代码中有打印路径. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <stack> #include <map> #include <

hdu--1026--bfs&amp;&amp;优先队列&amp;&amp;打印路径

这题 是被我自己搞复杂了.... 太SB了.... 还是porker的关于输出路径的简洁 有效多了 touch  me #include <iostream> #include <cstring> #include <queue> #include <stack> using namespace std; int ans, n, m; const int size = 110; char maze[size][size]; bool vis[size][si

uva_10054_The Necklace(欧拉回路+打印路径)

10054  The Necklace My little sister had a beautiful necklace made of colorful beads. Two successive beads in the necklace shared a common color at their meeting point. The figure below shows a segment of the necklace: But, alas! One day, the necklac

poj 2965 The Pilots Brothers&#39; refrigerator(dfs 枚举 +打印路径)

链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手,'+'代表关,'-'代表开,当16个把手都为开(即'-')时,门才能打开,问至少要几步门才能打开 改变状态规则:选定16个把手中的任意一个,可以改变其本身以及同行同列的状态(即若为开,则变为关,若为关,则变为开),这一次操作为一步. 分析:这题与poj 1753思路差不多,每个把手最多改变一次状态, 所有整个矩阵最多改变16次状态 思路:直接dfs枚举所有状态,直到找到目标状态 但是要打印路径,所有应在dfs时记录路径 注

Uva 642-CD(0-1背包+打印路径)

题目链接:点击打开链接 裸01背包 ,此题中 价值即体积... 打印路径..不多说了 一维的没看懂..上个二维的 #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #include <vector> #include <cstdio>

hdu--1160--LIS+打印路径

这题做完  就去吃饭了... 快1年了 没有正常的饮食.... 这题 数据蛮小的 1000可以用O(n^2)水过 而且只花了0ms 一般来说 打印路径是正序输出 而我们记录的时候都是 逆序记录的  所以 借用下stack特别好用 touch    me 1 #include <iostream> 2 #include <algorithm> 3 #include <stack> 4 using namespace std; 5 6 const int size = 10

uva 116 Unidirectional TSP dp + 打印路径

// uva116 Unidirectional TSP // 这题是在紫书(page 270)上看到的,个人理解就是数塔的升级版 // dp[i][j]表示从(i,j)出发到终点所达到的最大价值 // 所以很明显j是逆序的 // 状态转移方程为 // dp[i][j] = min(dp[i][j],dp[row[k]][j+1]+mp[i][j]) // rows[k]表示三行中的一行i,i-1,i+1,特判一下,排个序 // (因为多解时输出字典序最小的值) // 这题唯一比较难的地方就是打

vijos1635 SPFA和FLOYD算法如何打印路径

之前打的spfa或是floyd都只是用来求最短路,对于如何打印路径问题一点都没有概念 可能也是因为对于原理没有很理解的缘故? 总之,之后赶紧看了一下,现在总算是明白了.....MARK一下自己的理解 早晨碰到了一题挺裸的最短路问题:vijos1635 1.首先说说spfa的方法: 其实自己之前打的最多的spfa是在网格上的那种,也就是二维的 一维的需要邻接表+queue 以及对于queue的操作,自己也是醉了 这里贴一个模板(不含打印路径): #include<cstdio> #include