Description BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distributed shared memory machine with a hierarchical communication subsystem. Valentine McKee's research advisor, Jack Swigert, has asked her to benchmark the new system. Input The input will describe the topology of a network connecting n processors. The first line of the input will be n, the number of processors, such that 1 <= n <= 100. Output Your program should output the minimum communication time required to broadcast a message from the first processor to all the other processors. Sample Input Sample Output Source |
题目大意:是给出你一个类似于下三角的邻接矩阵,但是上面的没给出,因为是无向图,所以矩阵是对称的,而且自己到自己默认是0,所以这个矩阵上也没有给出,这个题还是直接看Input 那一块比较好吧,其他感觉没啥用。。。。
思路:整理好输入吧,基本上dijkstra的模板题目了,我看网上还有大神是用的atio做的,我这里是参考的另一位大神的输入方式,用的sscanf的方法,可以上网查一下,
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f3f
#define maxn 1005
using namespace std;
int n;
struct HeapNode
{
int d,u;
HeapNode(int d,int u):d(d),u(u){}
bool operator < (const HeapNode & ags) const
{
return d>ags.d;
}
};
struct Edge
{
int from,to,dist;
Edge(int f,int t,int d):from(f),to(t),dist(d){}
};
struct Dijkstra
{
int n,m;
vector<int > G[maxn];
vector<Edge> edges;
bool done[maxn];
int d[maxn];
int p[maxn];
void init(int n)
{
this->n=n;
for(int i=0;i<n;i++) G[i].clear();
edges.clear();
}
void AddEdges(int from,int to,int dist)
{
edges.push_back(Edge(from,to,dist));
m=edges.size();
G[from].push_back(m-1);
}
void dijkstra(int s)
{
priority_queue<HeapNode>Q;
for(int i=0;i<n;i++) d[i]=inf;
d[s]=0;
memset(done,0,sizeof(done));
Q.push(HeapNode(0,s));
while(!Q.empty())
{
HeapNode x=Q.top();Q.pop();
int u=x.u;
if(done[u])
continue;
done[u]=true;
for(int i=0;i<G[u].size();i++)
{
Edge &e=edges[G[u][i]];
if(d[e.to]>d[u]+e.dist)
{
d[e.to]=d[u]+e.dist;
p[e.to]=G[u][i];
Q.push(HeapNode(d[e.to],e.to));
}
}
}
}
}DJ;
int main()
{
while(scanf("%d",&n)==1)
{
DJ.init(n);
for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
{
char str[10];
int d;
scanf("%s",str);
if(str[0]!='x')
{
sscanf(str,"%d",&d);
DJ.AddEdges(i,j,d);
DJ.AddEdges(j,i,d);
}
}
DJ.dijkstra(0);
int max_v=-1;
for(int i=0;i<n;i++)
max_v = max(max_v,DJ.d[i]);
printf("%d\n",max_v);
}
return 0;
}