诊所设置,Socket编程入门教程

作者: 新金沙平台  发布:2019-08-02

2577 医院设置

 

时间限制: 1 s

空间限制: 32000 KB

题目等级 : 黄金 Gold

 

 

 

 

题目描述 Description

设有一棵二叉树,如下图

其中,圈中数字表示结点居民的人口.圈边上数字表示结点编号,.现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻结点之间 的距离为1.如上图中,若医院建在:

1处:则距离之和=4 12 2*20 2*40=136

3处:则距离之和=4*2 13 20 40=81

…….

图片 1

输入描述 Input Description

第一行一个整数n,表示树的结点数。(n<=100)

接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多个)分隔,其中:第一个数为居民人口数;第二个数为左链接,为0表示表链接;第三个数为右链接。

输出描述 Output Description

一个整数,表示最小距离和。

样例输入 Sample Input

5

13 2 3

4 0 0

12 4 5

20 0 0

40 0 0

样例输出 Sample Output

81

数据范围及提示 Data Size & Hint

这是用来快速学习 Python Socket 套接字编程的指南和教程。Python 的 Socket 编程跟 C 语言很像。
Python 官方关于 Socket 的函数请看
基本上,Socket 是任何一种计算机网络通讯中最基础的内容。例如当你在浏览器地址栏中输入 www.jb51.net 时,你会打开一个套接字,然后连接到 www.jb51.net 并读取响应的页面然后然后显示出来。而其他一些聊天客户端如 gtalk 和 skype 也是类似。任何网络通讯都是通过 Socket 来完成的。

  前段时间使用c 做项目开发,需要根据根据配置文件路径加载全局配置文件,并对外提供唯一访问点。面对这样一个需求,自然的就想到了使用单例模式来创建一个单例配置对象,供外部调用。一开始想使用boost中自带的单例类来实现,但是遗憾的是,boost中的的单例类好像只能使用无参的类构造函数,而我希望将配置文件路径作为单例配置对象的构造函数参数,此外正好借此机会使用c 自己动手实现一个单例类。

分类标签 Tags 点此展开

Flyoed 暴力

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int MAXN=10001;
 6 const int maxn=0x7fffffff;
 7 int map[MAXN][MAXN];
 8 int f[MAXN];
 9 int w[MAXN];
10 int main()
11 {
12     int n;
13     scanf("%d",&n);
14     for(int i=1;i<=n;i  )
15         for(int j=1;j<=n;j  )
16             map[i][j]=maxn;
17     for(int i=1;i<=n;i  )
18     {
19         int p,x,y;
20         scanf("%d%d%d",&p,&x,&y);
21         w[i]=p;
22         if(x!=0)
23             map[i][x]=map[x][i]=1;
24         if(y!=0)
25             map[i][y]=map[y][i]=1;
26     }
27     for(int k=1;k<=n;k  )
28     {
29         for(int i=1;i<=n;i  )
30         {
31             for(int j=1;j<=n;j  )
32             {
33                 if(map[i][k]!=maxn&&map[k][j]!=maxn)
34                 {
35                     if(map[i][j]>map[i][k] map[k][j])
36                     {
37                         map[i][j]=map[i][k] map[k][j];
38                     }
39                 }
40             }
41         }
42     }
43     int ans=maxn;
44     for(int i=1;i<=n;i  )
45     {
46         int now=0;
47         for(int j=1;j<=n;j  )
48         {
49             if(j!=i)
50             now=now map[j][i]*w[j];
51         }
52         if(now<ans)
53         ans=now;
54     }
55     printf("%d",ans);
56     return 0;
57 }

 

写在开头

  1.线程安全的c 单例类

本教程假设你已经有一些基本的 Python 编程的知识。
让我们开始 Socket 编程吧。

   实现线程安全的c 单例类,主要要实现以下几点:1)构造函数私有化,即构造函数、拷贝构造函数和复制构造函数定义为private。构造函数私有化是为了防止在类外部定义类对象;拷贝构造函数私有化是为了防止拷贝行为产生多个实例;复制构造函数私有化,防止赋值产生多个实例。  2)提供静态全局访问点,供外部调用访问   3)通过锁机制或者static初始化,保证多线程访问单例对象安全。程序如下:

创建 Socket

  清单1:单例类 config.h

首先要做的就是创建一个 Socket,socket 的 socket 函数可以实现,代码如下:

 1 #ifndef _CONFIG_H_
 2 #define _CONFIG_H_
 3 #include <windows.h>
 4 #include <iostream>
 5 using namespace std;
 6 class Config
 7 {
 8 private:     //1.构造函数私有
 9     Config()
10     {
11         m_path = "config.cfg";
12         loadGlobalConfig();
13     }
14     Config(string path) :m_path(path) 
15     {
16         loadGlobalConfig();
17     }
18     Config(const Config &);   //拷贝构造函数不实现,防止拷贝产生多个实例
19     Config & operator =  (const Config &);  //复制构造函数不实现,防止赋值产生多个实例
20 public:
21     static Config * getInstance()    //2.提供全局访问点
22     {
23         static Config m_singletonConfig;    //3.c  11保证了多线程安全,程序退出时,释放资源
24         return &m_singletonConfig;
25     }
26     void loadGlobalConfig()
27     {
28         //std::cout<<"111"<<std::endl;
29         //Sleep(1000);   //休眠1000ms
30         //std::cout<<"222"<<std::endl;
31         //加载配置文件......
32     }
33 private:
34     string m_path;    //配置文件的路径
35 };
36 #endif // _CONFIG_H_

复制代码 代码如下:

  2. static线程安全测试

#Socket client example in python

    前面提到,c 11保证了static对象在执行构造函数初始化时的线程安全性。对此c 11中的static变量的该特性,我做了一个实验,验证了static类对象的构造函数线程安全性。撤销清单1中28-30行代码的注释,执行main.cpp。main.cpp代码如下: 

import socket#for sockets

  清单2 :main.cpp

#create an AF_INET, STREAM socket (TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

 1 #include "config.h"
 2 #include <thread>
 3 #define THREAD_NUM 2
 4 void gTestStatic()
 5 {
 6     Config *pConf=Config::getInstance();
 7 }
 8 int main()
 9 {
10     std::thread threadArray[THREAD_NUM];   
11     for (int i=0;i<THREAD_NUM;i  )
12     {
13         threadArray[i] = std::thread(&gTestStatic);
14     }
15     for (int i = 0; i < THREAD_NUM; i  )
16     {
17         threadArray[i].join();    //主线程等待所有的线程结束
18     }
19     return 0;
20 }

print 'Socket Created'

  清单3 : 实验结果

函数 socket.socket 创建了一个 Socket,并返回 Socket 的描述符可用于其他 Socket 相关的函数。
上述代码使用了下面两个属性来创建 Socket:
地址簇 : AF_INET (IPv4)
类型: SOCK_STREAM (使用 TCP 传输控制协议)

1 output:
2             111
3             222

错误处理

  从这个实验可以看出,一个线程在执行类的构造函数时休眠1ms,另一个线程在等待,因此static对象的构造函数确实只执行了一次。因此,c 11确实保证了static对象构造函数初始化的多线程安全。

如果 socket 函数失败了,python 将抛出一个名为 socket.error 的异常,这个异常必须予以处理:

 

复制代码 代码如下:

#handling errors in python socket programs

import socket#for sockets
import sys#for exit

try:
#create an AF_INET, STREAM socket (TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
print 'Failed to create socket. Error code: ' str(msg[0]) ' , Error message : ' msg[1]
sys.exit();

print 'Socket Created'

好了,假设你已经成功创建了 Socket,下一步该做什么呢?接下来我们将使用这个 Socket 来连接到服务器。

注意:

与 SOCK_STREAM 相对应的其他类型是 SOCK_DGRAM 用于 UDP 通讯协议,UDP 通讯是非连接 Socket,在这篇文章中我们只讨论 SOCK_STREAM ,或者叫 TCP 。

连接到服务器

连接到服务器需要服务器地址和端口号,这里使用的是 www.jb51.net 和 80 端口。

首先获取远程主机的 IP 地址

连接到远程主机之前,我们需要知道它的 IP 地址,在 Python 中,获取 IP 地址是很简单的:

复制代码 代码如下:

import socket#for sockets
import sys#for exit

try:
#create an AF_INET, STREAM socket (TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
print 'Failed to create socket. Error code: ' str(msg[0]) ' , Error message : ' msg[1]
sys.exit();

print 'Socket Created'

host = 'www.jb51.net'

try:
remote_ip = socket.gethostbyname( host )

except socket.gaierror:
#could not resolve
print 'Hostname could not be resolved. Exiting'
sys.exit()

print 'Ip address of ' host ' is ' remote_ip

我们已经有 IP 地址了,接下来需要指定要连接的端口。
代码:

复制代码 代码如下:

import socket#for sockets
import sys#for exit

try:
#create an AF_INET, STREAM socket (TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
print 'Failed to create socket. Error code: ' str(msg[0]) ' , Error message : ' msg[1]
sys.exit();

print 'Socket Created'

host = 'www.jb51.net'
port = 80

try:
remote_ip = socket.gethostbyname( host )

except socket.gaierror:
#could not resolve
print 'Hostname could not be resolved. Exiting'
sys.exit()

print 'Ip address of ' host ' is ' remote_ip

#Connect to remote server
s.connect((remote_ip , port))

print 'Socket Connected to ' host ' on ip ' remote_ip

现在运行程序

复制代码 代码如下:

$ python client.py
Socket Created
Ip address of www.jb51.net is 61.145.122.155
Socket Connected to www.jb51.net on ip 61.145.122.155

这段程序创建了一个 Socket 并进行连接,试试使用其他一些不存在的端口(如81)会是怎样?这个逻辑相当于构建了一个端口扫描器。
已经连接上了,接下来就是往服务器上发送数据。

友情提示

使用 SOCK_STREAM/TCP 套接字才有 连接 的概念。连接意味着可靠的数据流通讯机制,可以同时有多个数据流。可以想象成一个数据互不干扰的管道。另外一个重要的提示是:数据包的发送和接收是有顺序的。
其他一些 Socket 如 UDP、ICMP 和 ARP 没有 连接 的概念,它们是无连接通讯,意味着你可从任何人或者给任何人发送和接收数据包。

发送数据

sendall 函数用于简单的发送数据,我们来向 oschina 发送一些数据:

复制代码 代码如下:

import socket#for sockets
import sys#for exit

try:
#create an AF_INET, STREAM socket (TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
print 'Failed to create socket. Error code: ' str(msg[0]) ' , Error message : ' msg[1]
sys.exit();

print 'Socket Created'

host = 'www.jb51.net'
port = 80

try:
remote_ip = socket.gethostbyname( host )

except socket.gaierror:
#could not resolve
print 'Hostname could not be resolved. Exiting'
sys.exit()

print 'Ip address of ' host ' is ' remote_ip

#Connect to remote server
s.connect((remote_ip , port))

print 'Socket Connected to ' host ' on ip ' remote_ip

#Send some data to remote server
message = "GET / HTTP/1.1rnrn"

try :
#Set the whole string
s.sendall(message)
except socket.error:
#Send failed
print 'Send failed'
sys.exit()

print 'Message send successfully'

上述例子中,首先连接到目标服务器,然后发送字符串数据 "GET / HTTP/1.1rnrn" ,这是一个 HTTP 协议的命令,用来获取网站首页的内容。

本文由新金沙平台发布于新金沙平台,转载请注明出处:诊所设置,Socket编程入门教程

关键词: 新金沙平台 js金沙娱乐平台