貪心,Dijkstra(The path,HDU 5385)

貪心構造距離,Dijkstra構造邊。


有一些細節寫錯了,在遍歷邊的時候,把e.v寫成了i,WA了一段時間。

一開始寫代碼的時候就要小心。


代碼

#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 100010;
const int inf = 0x3f3f3f3f;

int n,m;
int vis[maxn];
int d[maxn];
bool done[maxn];
int l[maxn];
int r[maxn];
struct Edge
{
    int u,v,d;
};
vector<Edge>edges;
vector<int>G[maxn];

void read()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        G[i].clear();
        vis[i]=0;
        l[i]=0;
        r[i]=inf;
    }
    edges.clear();
    int u,v;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d",&u,&v);
        edges.push_back((Edge){u,v,-1});
        G[u].push_back(edges.size()-1);
    }
}

void handle(int u)
{
    for(int i=0;i<(int)G[u].size();i++)
    {
        Edge& e = edges[G[u][i]];
        vis[e.v]=1;
        l[e.v]=max(l[e.v],d[u]+1);
        r[e.v]=min(r[e.v],d[u]+n);
    }
}

struct HeapNode
{
    int d,u;
    bool operator < (const HeapNode& rhs) const
    {
        return d>rhs.d;
    }
};

void dij()
{
    for(int i=1;i<=n;i++)
        done[i]=false;
    priority_queue<HeapNode>Q;
    Q.push((HeapNode){d[1],1});
    while(!Q.empty())
    {
        HeapNode now = Q.top();
        Q.pop();
        int u = now.u;
        if(done[u]) continue;
        done[u]=true;
        for(int i=0;i<(int)G[u].size();i++)
        {
            Edge& e = edges[G[u][i]];
            int D = d[e.v]-d[e.u];
            if(1<=D&&D<=n)
            {
                e.d=D;
                Q.push((HeapNode){d[e.v],e.v});
            }
            else e.d=n;
        }
    }
}

void solve()
{
    read();
    vis[1]=1;
    d[1]=0;
    handle(1);
    int m1=0;
    int m2=0;
    int k1=2;
    int k2=n;
    while(k1<=k2)
    {
        while(k1<=k2&&vis[k1])
        {
            d[k1]=max(l[k1],m1+1);
            m1=d[k1];
            handle(k1++);
        }
        if(k1<=k2&&vis[k2])
        {
            d[k2]=max(l[k2],m2+1);
            m2=d[k2];
            handle(k2--);
        }
    }
    dij();
    for(int i=0;i<m;i++)
        printf("%d\n",edges[i].d);
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--) solve();
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章