题目链接
题意
有n个基站,给定m条线路,线路上有不同的时间,从1号基站开始发送信息,当每一个基站接到信息时,它同时向其他基站发送信息,问多久能传输给所有基站。
解法
裸的最短路,画出图手推一下就知道任意基站得到信息的时间就是最短路跑出来的dis数组的值。跑一遍最短路算法找到dis数组最大值输出即可。注意输入,x代表inf,需要拿字符串处理一下,不能无脑cin。
代码
#include<iostream>
#include<cstring>
#include<queue>
#include<string>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
using namespace std;
typedef long long ll;
typedef pair <int,int> P;
const int maxn=1005;
const int maxe=50005;
const int inf=0x3f3f3f3f;
int head[maxn];
struct Edge{
int to;
int next;
int w;
} edge[maxe];
int cnt;
int dis[maxn];//存放距离
void init(){
cnt=0;
memset(head,-1,sizeof(head));
return ;
}
inline void add(int u,int v,int w){
edge[cnt].next=head[u];
edge[cnt].to=v;
edge[cnt].w=w;
head[u]=cnt;
cnt++;
}
void dij(int start){
memset(dis,0x3f,sizeof(dis));
priority_queue<P,vector<P>,greater<P> > q;
dis[start]=0;
q.push(P(0,start));
while(!q.empty()){
P p=q.top(); q.pop();
int v=p.second;
if(dis[v]<p.first) continue;
for(int i=head[v];i!=-1;i=edge[i].next){
int tmp=edge[i].to;
if(dis[tmp]>dis[v]+edge[i].w){
dis[tmp]=dis[v]+edge[i].w;
q.push(P(dis[tmp],tmp));
}
}
}
return ;
}
int main(){
IOS
int n,t;
cin>>n;
init();
for(int i=1;i<n;i++)
for(int j=1;j<=i;j++){
string s;
cin>>s;
if(s[0]=='x')
t=inf;
else{
t=0;
int p=0;
while(s[p]){
t*=10;
t+=s[p++]-'0';
}
}
add(i+1,j,t);
add(j,i+1,t);
}
dij(1);
int ans=-inf;
for(int i=1;i<=n;i++)
ans=max(ans,dis[i]);
cout<<ans<<endl;
return 0;
}