hdu2680最短路

本题的意思是求多个源点的最短路,比较简单,可以反过来求,把终点做源点。但是也可以构造一个源点。我用了dijkstra写的

#include <iostream>
using namespace std;
const int N=1009;
struct node
{
    int v,w,next;
}e[N*N];
int head[N],vis[N],dis[N];
int n,m,tot;
void add(int a,int b,int w)
{
    e[tot].v=b;
    e[tot].w=w;
    e[tot].next=head[a];
    head[a]=tot++;
}
void dij(int s)
{
    int i,k=0;
    memset(vis,0,sizeof(vis));
    memset(dis,-1,sizeof(dis));
    vis[0]=1;
    dis[0]=0;
    while(k!=-1)
    {
        if(k==s)break;
        vis[k]=1;
        for (i=head[k];i+1;i=e[i].next)
        {
            int v=e[i].v;
            if(dis[v]==-1||(dis[v]>dis[k]+e[i].w))
                dis[v]=dis[k]+e[i].w;
        }
        k=-1;
        for(i=1;i<=n;i++)
        {
            if(!vis[i]&&dis[i]!=-1)
            {
                k=i;
                break;
            }
        }
        for(i++;i<=n;i++)
        {
            if(!vis[i]&&dis[i]!=-1&&dis[i]<dis[k])
                k=i;
        }
    }
    
}
int main()
{
    int i,s,a,b,w,t;
    while (scanf("%d%d%d",&n,&m,&s)!=EOF)
    {
        tot=0;
        memset(head,-1,sizeof(head));
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&w);
            add(a,b,w);
        }
        scanf("%d",&t);
        for(i=0;i<t;i++)
        {
            scanf("%d",&a);
            add(0,a,1);
        }
        dij(s);
        if(dis[s]!=-1)
            printf("%d\n",dis[s]-1);
        else
            printf("%d\n",dis[s]);
    }
    return 0;
}

 

posted on 2013-08-07 20:18  黎昊明  阅读(141)  评论(0编辑  收藏  举报

导航