题意:有n个处理器,给出n*n的邻接矩阵的一半,表示相互之间传输信息的花费(另一半与给出的一半对称,即双向都可传输),x表示不能传输,问从第一个处理器传输到所有处理器的最小花费总和是多少。
就是跑一遍最短路,然后求和……
原来我以前做的最短路都这么水……
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<int,int> pii; struct cmp{
bool operator ()(pii a,pii b){
return a.first>b.first;
}
}; int g[][],dist[],n; int read(){
char c=getchar();
while(c!='x'&&(c>''||c<''))c=getchar();
if(c=='x')return 0x3f3f3f3f;
int d=;
while(c>=''&&c<=''){
d*=;
d+=c-'';
c=getchar();
}
return d;
} void dij(int s){
int i;
memset(dist,0x3f,sizeof(dist));
priority_queue<pii,vector<pii>,cmp>q;
dist[s]=;
q.push(make_pair(dist[s],s));
while(!q.empty()){
pii u=q.top();
q.pop();
if(u.first>dist[u.second])continue;
for(i=;i<=n;i++){
if(i!=u.second&&dist[i]>u.first+g[u.second][i]){
dist[i]=u.first+g[u.second][i];
q.push(make_pair(dist[i],i));
}
}
}
int ans=;
for(i=;i<=n;i++){
if(dist[i]>ans)ans=dist[i];
}
printf("%d\n",ans);
} int main(){
while(scanf("%d",&n)!=EOF){
memset(g,0x3f,sizeof(g));
int i,j;
for(i=;i<=n;i++){
for(j=;j<i;j++){
g[i][j]=g[j][i]=read();
}
}
dij();
}
return ;
}