poj 2457 Part Acq…

来源:互联网 发布:匹配声音软件是什么 编辑:程序博客网 时间:2024/05/19 15:23
题意:cows想用自己手上的商品(1)通过多次交换得到想要的商品(k),给出两种商品的交换关系,求出至少有多少种商品经过交换,输出交换的顺序。

思路:最短路。相当于求从1商品到k商品的最短路径,中间再记录一下结点信息。我用的是边表实现dij算法


//412K   79MS
#include
#include

const int EM = 50010;
const int VM = 1005;
const int inf = 0x3f3f3f3f;

struct Edge
{
    intfrm,to,nxt;
}edge[EM];

int head[VM],vis[VM],dis[VM],pre[VM];
int e,n,sta,end,ans;
bool mark;

void addedge(int cu,int cv)
{
    edge[e].frm= cu;
    edge[e].to =cv;
    edge[e].nxt= head[cu];
    head[cu] = e++;
}
void print(int tmp)//输入路径
{
    ++ans;
    if (tmp !=-1)
       print(pre[tmp]);
    if (tmp ==-1)
       return ;
    if(!mark)
    {
       printf ("%d\n",ans);
       mark = true;
    }
    printf("%d\n",tmp);
}
void Dij()
{
    int i;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    memset(pre,-1,sizeof(pre));
    for (i =head[sta];i != -1;i = edge[i].nxt)
    {
       dis[edge[i].to] = 1;
       pre[edge[i].to] = sta;
    }
    pre[sta] =-1,vis[sta] = 1;
    int cnt = n- 1;
    while (cnt--)
    {
       int min = inf;
       int flag;
       for (i = 1;i <= end;i ++)
           if (!vis[i]&&dis[i] < min)
               flag = i,min = dis[i];
       vis[flag] = 1;
       for (i = head[flag];i != -1;i = edge[i].nxt)
       {
           int v = edge[i].to;
           if (!vis[v]&&dis[v]>dis[flag]+1)
           {
               dis[v] = dis[flag] + 1;
               pre[v] =flag;       //v的前驱是flag
           }
       }
    }
    if (dis[end]== inf) //无路径
       printf ("-1\n");
    else
    {
       mark = false;
       ans = -1;
       int tmp = end;
       print(tmp);
    }
}
int main ()
{
    while(~scanf ("%d%d",&n,&end))
    {
       e = 0;
       sta = 1;
       memset (head,-1,sizeof(head));
       for (int i = 0;i < n;i ++)
       {
           int u,v;
           scanf ("%d%d",&u,&v);
           addedge(u,v);
       }
       Dij();
    }
    return0;
}

原创粉丝点击