分层图+Dijkstra 不知道咋WA了8个T T
查看原帖
分层图+Dijkstra 不知道咋WA了8个T T
905233
Rebirth_Yun楼主2023/8/10 09:47
#include<bits/stdc++.h> 
using namespace std;
const long long maxn = 2500001;
const long long inf = 0x3f3f3f3f;
long long n,m,s,cnt;
long long k,t;
long long dis[maxn],h[maxn],nxt[maxn],to[maxn],val[maxn];
bool vis[maxn];
void add(long long a,long long b,long long c=0)
{
    to[++cnt] = b;
    val[cnt] = c;
    nxt[cnt] = h[a];
    h[a] = cnt;
}
struct node
{
    long long v,w;
    friend bool operator< (node a,node b)
    {
        return a.w>b.w;
    }
}tmp;

priority_queue<node>q;
void Dijkstra()
{
    memset(vis,0,sizeof(vis));
	memset(dis,inf,sizeof(dis));
    for(long long i=1; i<=n; i++)
        dis[i]=inf;
    dis[s]=0;
    tmp.v = s,tmp.w=0;
    q.push(tmp);
    while (!q.empty())
    {
        long long u = q.top().v;
        q.pop();
        if(vis[u])
            continue;
        vis[u]=1;
        for(long long i=h[u];i;i=nxt[i])
        {
            if(dis[to[i]]>(long long)dis[u]+val[i])
            {
                dis[to[i]]=dis[u]+val[i];
                tmp.w = dis[to[i]],tmp.v=to[i];
                q.push(tmp);
            }
        }
    }
    return;
}
int main()
{
    ::ios_base::sync_with_stdio(false);
    memset(h,-1,sizeof(h));
    cin >>n>>m>>k>>s>>t;
    for(long long i=0,u,v,w;i<m;i++)
    {
        cin >> u >> v >> w;
        add(u,v,w);
        add(v,u,w);
        for(long long j=1; j<=k; j++)
        {
            add(u+(j*n),v+(j*n),w);
            add(v+(j*n),u+(j*n),w);
            add(u+(j-1)*n,v+(j*n));
            add(v+(j-1)*n,u+(j*n));
        }
    }
    for(int i=1;i<=k;i++)
        add(t+(i-1)*n,t+i*n,0);
    Dijkstra();
    cout << dis[t+(k*n)];
    return 0;
}

救救

2023/8/10 09:47
加载中...