[jzoj1163]第K短路

Solution

模板题 可以练练A*+Dij

注意它重新定义K短路为长度不同第K短

另外出数据的人喝了假酒 数据假得很有节奏 比如:

654 10000 100

359 388 7152

359 388

395 553 8580

553 395

357 555 4237

357 555

408 423 3844

408 423

练练手海星吧.

Code

#include 
#include 
#include 
#include 
#include 
#define oo 2139062143
#define fo(i,x,y) for (int i=(x);i<=(y);++i)
#define fd(i,x,y) for (int i=(x);i>=(y);--i)
#define fi first 
#define se second 
using namespace std;
typedef pair<int,int> PI;
const int N=10010,M=100100;
int n,m,k;
struct edge{
    int v,x,y;
};
int g[N];
bool operator <(edge a,edge b)
{
    return(a.v+g[a.y]>b.v+g[b.y]);
}
vector to[N],ot[N];
int dis[N],bz[N];
priority_queue qu;
void Dij()
{
    memset(dis,127,sizeof dis);
    memset(bz,0,sizeof bz);
    while(!qu.empty()) qu.pop();
    dis[n]=0;edge t;
    t.y=n,t.v=0;
    qu.push(t);
    while(!qu.empty())
    {
        t=qu.top();qu.pop();
        if(!t.y[bz])
        {
            bz[t.y]=1;  
            for(int p=ot[t.y].size(),i=0;iif(ot[t.y][i].y[dis]>ot[t.y][i].x[dis]+ot[t.y][i].v)
            {
                ot[t.y][i].y[dis]=ot[t.y][i].x[dis]+ot[t.y][i].v;
                edge tt=ot[t.y][i];tt.v=ot[t.y][i].y[dis];
                qu.push(tt);
            }
        }
    }
    fo(i,1,n) g[i]=dis[i];
}
int ti[N],ans[N],a0;
int astar()
{
    memset(ans,255,sizeof ans);
    memset(ti,0,sizeof ti);
    while(!qu.empty()) qu.pop();
    edge tp;tp.x=0,tp.y=1,tp.v=0;
    qu.push(tp);
    while(!qu.empty())
    {
        edge w=qu.top();qu.pop();
        if(w.y==n) 
        {
            if(w.v!=a0[ans]) ans[++a0]=w.v;
            if(a0==k)return(w.v);       
        }
        for(int p=to[w.y].size(),i=0;ireturn -1;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    fo(i,1,m)
    {
        edge tp;
        scanf("%d%d%d",&tp.x,&tp.y,&tp.v);
        to[tp.x].push_back(tp);swap(tp.x,tp.y);
        ot[tp.x].push_back(tp);
        char c;
        while(c=getchar(),c!='\n');
    }
    Dij();
    printf("%d\n",astar());
    return 0;
}










你可能感兴趣的:(最短路,Astar)