打了个堆优化的dijkstra,结果惨兮兮的爆掉了
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=205;
const int inf=1234567890;
struct edge
{
int to,next,val;
}e[N*N];
struct node
{
int pos;
int dis;
friend bool operator <(node a,node b)
{
return a.dis<b.dis;
}
};
priority_queue<node> q;
int n;
int w,dis[N];
bool vis[N];
int head[N],cnt=0;
void add_edge(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].val=w;
e[cnt].next=head[u];
head[u]=cnt;
}
void init()
{
for(int i=1;i<=n;i++)
dis[i]=inf;
dis[1]=0;
}
int main()
{
scanf("%d",&n);
init();
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
scanf("%d",&w);
add_edge(i,j,w);
}
}
q.push((node){1,0});
while(!q.empty())
{
node tmp=q.top();
q.pop();
int p=tmp.pos;
int d=tmp.dis;
if(vis[p])continue;
vis[p]=1;
for(int k=head[p];k!=-1;k=e[k].next)
{
int t=e[k].to;
if(dis[t]>dis[p]+e[k].val)
{
dis[t]=dis[p]+e[k].val;
if(!vis[t])
{
q.push((node){t,dis[t]});
}
}
}
}
printf("%d\n",dis[n]);
return 0;
}