您的位置:首页 > 其它

ZOJ Problem Set - 1082 Stockbroker Grapevine

2011-10-10 17:43 309 查看
题意:

从一个人散布消息,可以同时散布给所有人消息,需要的最长的时间。然后求每个人散布给其他人的最长时间中的最小时间。输出最小时间的人和最小时间。

最短路径,Dijkstra算法。

在运用优先队列存储。

这题主要要理解好题意,不然一头雾水。

理解到了,模板题一道。直接套。
#include <iostream>
#include <queue>
#include <cstring>
#define M 100000
using namespace std;
struct Node
{
int num;
int n;
}node[101];
priority_queue<Node>q;
priority_queue<Node>p;
bool operator < (const Node &a,const Node &b)
{
if(a.num > b.num) return 1;
else return 0;
}
int w[101][101],cot[101],snum;
void init()
{
int i,j;
for(i = 0;i < 101;i ++)
for(j = 0;j < 101;j ++)
w[i][j] = M;
}
void relax(int u,int v)
{
if(node[v].num >node[u].num + w[u][v])
node[v].num = node[u].num + w[u][v];
}
void Dij()
{
int i;
for(i = 1;i <= snum;i ++)
if(cot[i] == 0)
q.push(node[i]);
int arr = q.top().n;
for(i = 1;i <= snum;i ++)
if(w[arr][i] != M)
relax(arr,i);
cot[arr] = 1;
while(!q.empty()) q.pop();
}
int main()
{
int n,i,j,u,v;
Node maxi;
while(cin>>snum&&snum!=0)
{

init();
for(i = 1;i <= snum;i ++)
{
cin>>n;
for(j = 0;j < n;j ++)
{cin>>u>>v;
w[i][u] = v;}
}

for(i = 1;i <= snum;i ++)
{
memset(cot,0,sizeof(cot));
for(int k = 0;k < 101;k ++)
{node[k].num = M;node[k].n = k;}
node[i].num = 0;
for(j = 1;j <= snum;j ++)
{
Dij();
}
maxi.num = -1;
for(j = 1;j <= snum;j ++)
{

if(j !=i)
{
if(node[j].num > maxi.num)
{
maxi.num = node[j].num;
}
}
}
maxi.n = i;
p.push(maxi);
}
cout<<p.top().n<<" "<<p.top().num<<endl;
while(!p.empty()) p.pop();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: