CCF 201512-4 送货 CPP
2017-03-28 09:41
169 查看
问题描述
为了增加公司收入,F公司新开设了物流业务。由于F公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎,物流业务马上遍及了城市的每条街道。然而,F公司现在只安排了小明一个人负责所有街道的服务。
任务虽然繁重,但是小明有足够的信心,他拿到了城市的地图,准备研究最好的方案。城市中有n个交叉路口,m条街道连接在这些交叉路口之间,每条街道的首尾都正好连接着一个交叉路口。除开街道的首尾端点,街道不会在其他位置与其他街道相交。每个交叉路口都至少连接着一条街道,有的交叉路口可能只连接着一条或两条街道。
小明希望设计一个方案,从编号为1的交叉路口出发,每次必须沿街道去往街道另一端的路口,再从新的路口出发去往下一个路口,直到所有的街道都经过了正好一次。
输入格式
输入的第一行包含两个整数n, m,表示交叉路口的数量和街道的数量,交叉路口从1到n标号。
接下来m行,每行两个整数a, b,表示和标号为a的交叉路口和标号为b的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。两个路口之间最多有一条街道。
输出格式
如果小明可以经过每条街道正好一次,则输出一行包含m+1个整数p1, p2, p3, ..., pm+1,表示小明经过的路口的顺序,相邻两个整数之间用一个空格分隔。如果有多种方案满足条件,则输出字典序最小的一种方案,即首先保证p1最小,p1最小的前提下再保证p2最小,依此类推。
如果不存在方案使得小明经过每条街道正好一次,则输出一个整数-1。
样例输入
4 5
1 2
1 3
1 4
2 4
3 4
样例输出
1 2 4 1 3 4
样例说明
城市的地图和小明的路径如下图所示。
样例输入
4 6
1 2
1 3
1 4
2 4
3 4
2 3
样例输出
-1
样例说明
城市的地图如下图所示,不存在满足条件的路径。
评测用例规模与约定
前30%的评测用例满足:1 ≤ n ≤ 10, n-1 ≤ m ≤ 20。
前50%的评测用例满足:1 ≤ n ≤ 100, n-1 ≤ m ≤ 10000。
所有评测用例满足:1 ≤ n ≤ 10000,n-1 ≤ m ≤ 100000。
###CPP、JAVA 一直显示运行错误。。。先记上,以后再改。。
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<vector> #include<queue> #include<stack> #include<algorithm> #include<memory.h> using namespace std; /* 欧拉路径和欧拉回路 欧拉路径:从某结点出发一笔画成所经过的路线叫做欧拉路径。 欧拉回路:在欧拉路径的基础上又回到起点。 a、凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为 终点画完此图。 b、凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另 一个奇点终点。 c、其他情况的图都不能一笔画出。(有偶数个奇点除以2便可算出此图需几笔画成。) 欧拉回路和欧拉路径的判断 欧拉回路: 无向图:每个顶点的度数都是偶数,则存在欧拉回路。 有向图:每个顶点的入度都等于出度,则存在欧拉回路。 欧拉路径: 无向图:当且仅当该图所有顶点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。 有向图:当且仅当该图所有顶点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1,其 他顶点 出度=入度。 */ int m,n; vector<int> vec[10005]; //queue<int> q; stack<int> s; int via[10005][10005]; bool vis[10005]; int d[10005]; void dfs(int a) { vector<int>::iterator pos; for(pos=vec[a].begin();pos!=vec[a].end();pos++) { int v=*pos; if(vis[v]==0){ vis[v]=1; dfs(v); //vis[v]=1; } } } void dfs_edge(int u) { vector<int>::iterator pos; for(pos=vec[u].begin();pos!=vec[u].end();pos++) { int v=*pos; if(via[u][v]==0){ via[u][v]=1; via[v][u]=1; dfs_edge(v); s.push(v); } } } int main() { cin>>m>>n; memset(via,0,sizeof(via)); memset(d,0,sizeof(d)); memset(vis,0,sizeof(vis)); while(n--){ int a,b; cin>>a>>b; vec[a].push_back(b); vec[b].push_back(a); //via[a][b]=-1; //via[b][a]=-1; d[a]++; d[b]++; } vis[1]=1; dfs(1); int flag=0; for(int i=1;i<=m;i++){ if(vis[i]==0){ flag=1; break; } } if(flag==1){ cout<<-1<<endl; } else{ int sum=0; for(int i=1;i<=m;i++) { sort(vec[i].begin(),vec[i].end()); if(d[i]%2!=0) sum++; } if(sum==2||sum==0){ if(sum==2){ if(d[1]%2==1){ dfs_edge(1); s.push(1); while(!s.empty()) { cout<<s.top()<<" "; s.pop(); } cout<<endl; } else{ cout<<-1<<endl; } } else{ dfs_edge(1); s.push(1); while(!s.empty()) { cout<<s.top()<<" "; s.pop(); } cout<<endl; } } else{ cout<<-1<<endl; } } return 0; }
import java.util.Scanner; import java.util.Vector; import java.util.Stack; import java.util.Collections; import java.util.LinkedList; import java.util.Queue; public class Main { public static Vector<Integer>[] vec=new Vector[10010]; public static int []d=new int[10010]; public static int []vis=new int[10010]; public static int [][]visited=new int[10010][10010]; public static Stack<Integer> s=new Stack(); public static Queue<Integer> q=new LinkedList<Integer>(); static void bfs(int u) { vis[u]=1; q.add(u); while(!q.isEmpty()){ for(int i=0;i<vec[u].size();i++){ int v=vec[u].get(i); if(vis[v]==0){ vis[v]=1; q.add(v); } } q.remove(); } } static void dfs(int u) { vis[u]=1; for(int i=0;i<vec[u].size();i++) { int v=vec[u].get(i); if(vis[v]==0){ dfs(v); } } } private static void dfs2(int u) { for(int i=0;i<vec[u].size();i++) { int v=vec[u].get(i); if(visited[u][v]==0){ visited[u][v]=1; visited[v][u]=1; dfs2(v); s.push(v); } } } public static void main(String[] args) { int m,n; //int d[10010]; Scanner sc=new Scanner(System.in); m=sc.nextInt(); n=sc.nextInt(); for(int i=1;i<=m;i++) { vec[i]=new Vector(); } for(int i=0;i<n;i++) { int a,b; a=sc.nextInt(); b=sc.nextInt(); vec[a].add(b); vec[b].add(a); d[a]++; d[b]++; } sc.close(); dfs(1); for(int i=1;i<=m;i++) { if(vis[i]==0){ System.out.println(-1); return; } } //System.out.println("hello"); int sum=0; for(int i=1;i<=m;i++) { if(d[i]%2==1)sum++; } if(sum==0||(sum==2&&d[1]%2==1)) { for(int i=1;i<=m;i++){ Collections.sort(vec[i]); } dfs2(1); s.push(1); while(!s.isEmpty()) { System.out.print(s.pop()+" "); } } else System.out.println(-1); } }
相关文章推荐
- 201512-4 送货 ccf
- ccf 201512-4 送货
- CCF 201512-4 送货(欧拉路径+字典序最小)
- CCF 201512-4 送货(错误)
- ccf 201512-4 送货 无向图欧拉回路
- CCF 201512-4 送货(欧拉路径+字典序最小)
- CCF-201512-4 送货(欧拉路径)
- CCF 201512-4 送货 (并查集+DFS,欧拉路)
- CCF 201512-4 送货
- CCF 习题 201512-4 送货 (并查集 + DFS 找欧拉道路)
- CCF 201512-4 送货(最小字典序欧拉回路)
- CCF 201512-1 数位之和
- 【CCF CSP】 201512-2 消除类游戏(100分)
- CCF系列之矩阵(201512-5)
- CCF资格认证201512-3参考
- CCF 201512-2 消除类游戏
- CCF 201512-3 画图
- CCF 201512-3画图
- CCF之送货(java)
- 【CCFCSP】201512-3 画图