poj 3463 Sightseeing(dij)

来源:互联网 发布:知乎 大误 龙 编辑:程序博客网 时间:2024/06/02 04:40
详见:http://blog.sina.com.cn/s/blog_676070110100rult.html

//308K   79MS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#define VM 1005
#define EM 10010
using namespace std;

const int inf = 0x3f3f3f3f;
int head[VM],cnt[VM][2],dist[VM][2],vis[VM][2];
int e,src,des,n,m;

struct E
{
    intto,w,nxt;
} edge[EM];

void addedge (int cu,int cv,int cw)
{
    edge[e].to =cv;
    edge[e].w =cw;
    edge[e].nxt= head[cu];
    head[cu] = e++;
}

int dij ()
{
    inti,j,u,min,flag;
    memset(dist,0x3f,sizeof(dist));
    memset(vis,0,sizeof(vis));
    memset(cnt,0,sizeof(cnt));
    dist[src][0]= 0;
    cnt[src][0]= 1;
    for (i = 1;i < 2*n; i ++)
    {
       min = inf;
       for (j = 1; j <= n; j ++)
           if (!vis[j][0]&&dist[j][0]< min)
           {
               u = j;
               flag = 0;
               min = dist[j][0];
           }
           else if (!vis[j][1]&&dist[j][1]< min)
           {
               u = j;
               flag = 1;
               min = dist[j][1];
           }
       if (min == inf)
           break;
       vis[u][flag] = 1;
       for (j = head[u]; j != -1; j = edge[j].nxt)
       {
           int v = edge[j].to;
           int w = edge[j].w + min;
           if (dist[v][0] > w)
           {
               dist[v][1] = dist[v][0];
               cnt[v][1] = cnt[v][0];
               dist[v][0] = w;
               cnt[v][0] = cnt[u][flag];
           }
           else if (dist[v][0] == w)
               cnt[v][0] += cnt[u][flag];
           else if (dist[v][1] > w)
           {
               dist[v][1] = w;
               cnt[v][1] = cnt[u][flag];
           }
           else if (dist[v][1] == w)
               cnt[v][1] += cnt[u][flag];
       }

    }
    if(dist[des][0] + 1 == dist[des][1])
       cnt[des][0] += cnt[des][1];
    returncnt[des][0];
}
int main ()
{
    intT,u,v,w;
    scanf("%d",&T);
    while (T--)
    {
       scanf ("%d%d",&n,&m);
       memset (head,0xff,sizeof(head));
       e = 0;
       while (m --)
       {
           scanf("%d%d%d",&u,&v,&w);
           addedge (u,v,w);
       }
       scanf ("%d%d",&src,&des);
       int ans = dij();
       printf ("%d\n",ans);
    }
    return0;
}