BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路

来源:互联网 发布:电气原理图软件 编辑:程序博客网 时间:2024/04/28 12:16

最短路问题
只要把所有点之间的最短路跑出来就好了
Floyd O(n3)
然而我用了斐(zi)波(dai)那(S)契(T)堆(L)优(lie)化的dijkstra
明明理论复杂度是O(n2log2n)的说
哭晕在厕所


#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#define g getchar()#define p pair<int,int>#define ll long long#define inf 0x3f3f3f3fusing namespace std;inline ll read(){    ll x=0,f=1;char ch=g;    for(;ch<'0'||ch>'9';ch=g)if(ch=='-')f=-1;    for(;ch>='0'&&ch<='9';ch=g)x=x*10+ch-'0';    return x*f;}inline void out(ll x){    int a[25],wei=0;    if(x<0)putchar('-'),x=-x;    for(;x;x/=10)a[++wei]=x%10;    if(wei==0){puts("0");return;}    for(int j=wei;j>=1;--j)putchar('0'+a[j]);    putchar('\n');}int n,m,a[10005],dis[105][105],d[105][105];bool pd[105];priority_queue<p,vector<p>,greater<p> >Q;int clear(){    for(;!Q.empty();Q.pop());    memset(pd,0,sizeof(pd));}int main(){//  freopen("","r",stdin);//  freopen("","w",stdout);    n=read();m=read();    for(int i=1;i<=m;++i)a[i]=read();    for(int i=1;i<=n;++i)    for(int j=1;j<=n;++j)dis[i][j]=read();    memset(d,inf,sizeof(d));    for(int i=1;i<=n;++i){        clear();        d[i][i]=0;        Q.push(make_pair(d[i][i],i));        for(int k=1;k<n;++k){            for(;(!Q.empty())&&pd[Q.top().second];Q.pop());            int u=Q.top().second;pd[u]=1;            for(int j=1;j<=n;++j)if((!pd[j])&&d[i][u]+dis[u][j]<d[i][j])            d[i][j]=d[i][u]+dis[u][j],Q.push(make_pair(d[i][j],j));        }    }    int ans=0;    for(int i=1;i<m;++i)ans+=d[a[i]][a[i+1]];    out(ans);    return 0;}
0 0
原创粉丝点击