HDU 5521 Meeting(最短路+Dijkstra)(2015沈阳现场赛)

题意:有n个点,m个关系;对于每个关系,输入t,s,接着输入s个数,表示这s个数俩俩之间有边且权值都为t。两个人分别从同时1,n出发,问两人相遇所耗的最短距离,相遇只能在结点上相遇,且若两人走到距离不同则取最大的。求出所有符合条件相遇时的结点,若没有,则输出Evil John,若有多个,则按字典序最小输出所有可行结点。

思路:此题难点主要是建图,建好图从1和n点Dijkstra,再枚举每个点,找出最小的相遇距离就OK。下面说说建图。。直接暴力建想都不要想,可以在每一个block里建一个根结点,把这些点连到这个根上,最后得出的结果除以2就是最短的时间(这个自己画个图很好理解)。这题我用链式前向星存储,计蒜客上用vector超内存……

#include
using namespace std;
#define ll long long
const ll INF=0x3f3f3f3f;
const int maxn=2000005;
using namespace std;
#define pa pair
struct node
{
    int to,next,v;
};
node edge[maxn];
int cnt=1,head[maxn];
ll dist1[maxn],dist2[maxn];
void init()
{
    memset(head,-1,sizeof(head));
    cnt=0;
}
void addedge(int u,int v,int w)
{
    cnt++;
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=cnt;
    edge[cnt].v=w;
}
void Dijkstra(int n,int now,ll dis[])
{
    priority_queue,greater >q;
    int i;
    for (i=1;i<=n;i++)
      dis[i]=INF;
    dis[now]=0;
    q.push(make_pair(0,now));
    while (!q.empty())
      {
        now=q.top().second;
        q.pop();
        for (i=head[now];i;i=edge[i].next)
          if (dis[now]+edge[i].v>t;
    while(t--)
    {
        init();
        int n,m;
        scanf("%d%d",&n,&m);
        int time,all,a,tot=n+1;
        for(int j=0; j

 

你可能感兴趣的:(最短路)