fafu1224 - Ping

题目链接: 点击打开链接
Description:
      在操作系统中,我们常常用ping程序来查看某两个主机之间是否能够相通,其基本格式是ping ip/主机名。Ping程序的原理是从源主机向目的主机发送一个icmp回显请求报文,如果目的主机收到这个报文就会发送回一个icmp回显应答的报文,因此我们可以根据是否收到目的主机的应答来判断两个主机是否能够相通(假设报文在传送过程中不会丢失)。 
      在linux操作系统上,我们还可以用tcpdump程序来查看通过主机网卡的所有报文,它的原理是通过将网络接口卡设置成混杂模式来截获经过网络接口的每一个分组,现在给出在主机0运行tcpdump的所有输出,试只根据这些信息来判断某两个主机是否相通。(假设如果a能够ping通b,b也能ping通a)。 
      
Input:
输入文件含有多组测试数据,每组数据的第一行有两个整数k,m(0 < k<=30000),k代表总共截获了k个报文,m代表有m个询问,接下来的k行每行描述一个报文,有以下两种格式: 1.****** 表示其他报文 2.i Reply 0 表示主机i向主机0发回一个icmp回显应答报文( 0< i<=20000) 再接下来的m行中每行有两个整数a b,表示询问a b是否相通。(0 < a,b<=20000)
Output:
对于每个询问如果能够判断出相通则输出YES,否则输出NO。
Sample Input:
3 2
******
1 reply 0
2 reply 0
0 1
2 3
4 1
******
1 reply 0
5 reply 0
******
1 2
Sample Output:
YES
NO
NO


#include<iostream>
#include<string>
using namespace std;

const int N = 30005;
char c[N][100];

int main()
{
	int k, m, i, j, l, t, ans;
	while(cin >> l >> m)
	{
		int flag[20005]={0};
		flag[0] = 1; 
		int a[20005], b[20005];
		getchar();
		for(i=0; i<l; i++)
			gets(c[i]);
		
		for(j=0; j<m; j++)
			cin >> a[j] >> b[j];

		for(j=0; j<i; j++)
		{
			for(k=0; k<strlen(c[j]); k++)
			{
				if(c[j][k] == '*')	
					break;

				if(c[j][k] == ' ')
				{
					ans = 1;
					t = 0;
					do{
						t += (c[j][--k] - '0') * ans;
						ans *= 10;
					}while(k > 0);

					flag[t] = 1;
					break;
				}	
			}
		}
		
		for(j=0; j<m; j++)
			if(flag[a[j]] && flag[b[j]] )
				cout << "YES" << endl;
			else
				cout << "NO" << endl;
	}
	return 0;
}


你可能感兴趣的:(ACM,解题报告,fafu1224)