POJ

来源:互联网 发布:方正粗金陵简体 mac 编辑:程序博客网 时间:2024/05/22 23:05

题目链接点这里


,,s==t时是真的坑,,初始是不算到过的,,所以k++

#include<iostream>#include<cstdio>#include<math.h>#include<algorithm>#include<map>#include<set>#include<bitset>#include<stack>#include<queue>#include<string.h>#include<cstring>#include<vector>#include<time.h>#include<stdlib.h>using namespace std;#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f3f#define FIN freopen("input.txt","r",stdin)#define mem(x,y) memset(x,y,sizeof(x))typedef unsigned long long ULL;typedef long long LL;#define fuck(x) cout<<"x"<<endl;#define MX 1111#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef pair<pair<int,int>,int> PIII;typedef pair<int,int> PII;const double eps=1e-5;int n,m,s,t,k;int head[MX],cnt;struct Edge{    int nxt,to,dist;} E[MX*MX];void edge_init(){    mem(head,-1);    cnt=0;}void edge_add(int u,int v,int dist){    E[cnt].nxt=head[u];    E[cnt].dist=dist;    E[cnt].to=v;    head[u]=cnt++;}int d[MX];void dijkstra(int s,int t){    mem(d,0x3f);    priority_queue<PII,vector<PII>,greater<PII> > Q;    Q.push(PII(0,s));    d[s]=0;    while(!Q.empty())    {        PII u=Q.top();        Q.pop();        if(u.first>d[u.second]) continue;        for(int i=head[u.second]; ~i; i=E[i].nxt)        {            int v=E[i].to;            if(d[v]<=u.first+E[i].dist)continue;            d[v]=u.first+E[i].dist;            Q.push(PII(d[v],v));        }    }}struct Nod{    int h,dist,u;    bool operator <(const Nod a)const    {        return h>a.h;    }    Nod(int h, int dist, int u):h(h),dist(dist),u(u) {}};int Astar(int s,int t){    if(s==t)k++;    if(d[s]>=INF)return -1;    priority_queue<Nod> Q;    Q.push(Nod(0+d[s],0,s));    int cnt=0;    while(!Q.empty())    {        Nod u=Q.top();        Q.pop();        if(u.u==t)        {            cnt++;            if(cnt==k)return  u.dist;        }        for(int i=head[u.u]; ~i; i=E[i].nxt)        {            int v=E[i].to;            Q.push(Nod(u.dist+E[i].dist+d[v],u.dist+E[i].dist,v));        }    }    return -1;}int w[111*MX][3];int main(){    FIN;    while(cin>>n>>m)    {        edge_init();        for(int i=1; i<=m; i++)        {            scanf("%d%d%d",&w[i][0],&w[i][1],&w[i][2]);            edge_add(w[i][1],w[i][0],w[i][2]);        }        cin>>s>>t>>k;        dijkstra(t,s);        edge_init();        for(int i=1; i<=m; i++)        {            edge_add(w[i][0],w[i][1],w[i][2]);        }        printf("%d\n",Astar(s,t));    }    return 0;}


原创粉丝点击