MPI Maelstrom
POJ - 1502
用不着堆优化也能过,就是想练一下手
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 1e9
using namespace std;
struct node
{
int index,dis;
bool operator <(const node &s)const
{
return dis>s.dis;
}
}d[105];
int u[10005],v[10005],w[10005];
int book[105],first[105],nex[20005];
int m=0,n;
void init()
{
memset(book,0,sizeof(book));
char c[10];
for(int i=2;i<=n;i++){
for(int j=1;j<=i-1;j++){
scanf("%s",c);
if(c[0]!='x'){
u[++m]=i;
v[m]=j;
w[m]=atoi(c);
//a[i][j]=atoi(c);
//a[j][i]=a[i][j];
}
}
}
for(int i=m+1;i<=2*m;i++){
u[i]=v[i-m];
v[i]=u[i-m];
w[i]=w[i-m];
}
for(int i=1;i<=n;i++){
first[i]=-1;
}
for(int i=1;i<=2*m;i++){
nex[i]=first[u[i]];
first[u[i]]=i;
}
}
void dij()
{
for(int i=1;i<=n;i++){
d[i].index=i;
d[i].dis=inf;
}
priority_queue<node>q;
node now,next;
d[1].dis=0;
q.push(d[1]);
while(!q.empty())
{
now=q.top();
q.pop();
if(book[now.index]==1){continue;}
book[now.index]=1;
for(int i=first[now.index];i!=-1; i=nex[i])
{
if(d[v[i]].dis>d[now.index].dis+w[i]){
d[v[i]].dis=d[now.index].dis+w[i];
q.push(d[v[i]]);
}
}
}
}
int main()
{
scanf("%d",&n);
init();
dij();
int mmax=0;
for(int i=2;i<=n;i++){
if(d[i].dis>mmax){mmax=d[i].dis;}
}
printf("%d\n",mmax);
}