淘先锋技术网

首页 1 2 3 4 5 6 7

题意:

题意:信息传输,总共有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();
    }
}