问题描述
*标题*
网络时延
*时间限制*
1 S
*内存限制*
1000 Kb
*问题描述*
有N个网络节点,标记为1到N。
给定一个二维数组times[M][3],表示信号经过有向边的传递时间。times[i][3] = {u, v, w}, 其中u是源节点,v是目标节点,w是一个信号从源节点传递到目标节点的时间,即二维数组中的一行表示一条带权有向边。
现在,我们向当前的节点K 发送一个信号。最少需要多长时间才能使所有节点都收到信号?如果不能使所有节点收到信号,返回-1。
注意:
1、 M的范围在[1,50]之间
2、 N的范围在[1, 20] 之间。
3、 K的范围在[1, N] 之间。
4、 所有的边times[i][3] =(u, v, w)都有1 <= u, v <= N 且 1 <= w <= 50。
*问题输入*
多行输入数据,第1行为3个正整数,分别是M,N,K。接下来有M行,每行有3个正整数,分别是u, v, w。
*问题输出*
输出一个数,表示需要多久才能使所有节点都收到信号。如果不能使所有节点收到信号,返回-1
*输入样例*
3 4 2
2 1 1
2 3 1
3 4 1
*输出样例*
2
代码部分
#include<stdio.h>
#include<iostream>
using namespace std;
int count=0;
int visited[1000]={0};
int vexnum;
int arcs[1000][1000];
int FirstAdjVex(int v)
{
int i;
for(i=0;i<vexnum;i++)
{
if(arcs[v][i]==1&&visited[i]==0)
return i;
}
return -1;
}
int NextAdjVex(int v,int w)
{
int i;
for(i=w;i<vexnum;i++)
{
if(arcs[v][i]==1&&visited[i]==0)
return i;
}
return -1;
}
void DFS(int v)
{
int w;
visited[v]=1;
for(w=FirstAdjVex(v);w>=0;w=NextAdjVex(v,w))
{
if(visited[w]==0) DFS(w);
}
}
void DFSTraverse()
{
int v;
for(v=0;v<vexnum;v++)
{
if(visited[v]==0)
{
DFS(v);
count++;
}
}
}
int main()
{
int n,v,u;
cin>>vexnum>>n;
int i,j;
for(i=0;i<vexnum;i++)
{
for(j=0;j<vexnum;j++)
arcs[i][j]=0;
}
for(i=0;i<n;i++)
{
cin>>v>>u;
arcs[v-1][u-1]=1;
arcs[u-1][v-1]=1;
}
DFSTraverse();
cout<<count-1;
return 0;
}