题意:
题意:信息传输,总共有n个传输机,先要从1号传输机向其余n-1个传输机传输数据,传输需要时间,给出一个严格的下三角(其实就是对角线之下的不包括对角线的部分)时间矩阵,a[i][j]代表从i向j传输数据需要的时间,并规定数据传输之间并无影响,即第一个传输机可以同时向其余传输机传输数据。求所有传输任务所需的最短时间。
tip:
我知道这道题查体题姐估计都是看不懂题orz
http://poj.org/problem?id=1502
dijstra就没了
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int n;
typedef pair<int,int>pii;
priority_queue<pii,vector<pii>,greater<pii> >q;
const int maxn = ;
const int INF = <<;
int head[maxn*],tot,dis[maxn*];
char s[];
int utoi(){
int ans = ;
for(int i = ; i < strlen(s);i++){
ans = ans*+s[i]-'0';
}
//printf("ans = %d\n",ans);
return ans;
}
struct node{
int v,w,next;
}edges[maxn*maxn*];
void add(int u,int v,int w){
edges[tot].v = v;edges[tot].w = w;edges[tot].next=head[u];head[u] = tot++;
edges[tot].v = u;edges[tot].w = w;edges[tot].next=head[v];head[v] = tot++;
}
void dij(){
while(!q.empty()){
int no = q.top().second;q.pop();
for(int k = head[no];k != -;k=edges[k].next){
if(dis[edges[k].v]>dis[no]+edges[k].w){
dis[edges[k].v] = dis[no]+edges[k].w;
q.push(make_pair(dis[edges[k].v],edges[k].v));
}
}
}
}
void init(){
memset(head,-,sizeof(head));
tot= ;
for(int i = ; i <= n ; i++) dis[i] = INF;
for(int i = ; i <= n ; i++){
for(int j = ; j < i ; j++){
scanf("%s",s);
if(s[]!='x'){
add(i,j,utoi());
}
}
}
q.push(make_pair(,));
dis[] = ;
}
void sov(){
int ans = ;
for(int i = ; i <= n ; i++)
ans = max(ans,dis[i]);
printf("%d\n",ans);
}
int main(){
while(~scanf("%d",&n)){
init();
dij();
sov();
}
}