POJ 3463 Sightseeing (第k短路)

来源:互联网 发布:网络地板厂家 编辑:程序博客网 时间:2024/06/11 06:00

~~题目链接~~~


题目大意:给出一个旅游路线,现在要求求它的最短路和比最短路长1的路共有多少条。


思路:看代码吧


#include <cstdio>#include <cstring>#define inf 1234567890using namespace std;struct node{    int v, w, next;}edge[10002];struct node2{    int cnt,sum;}dist[1002][4];int n = 0, m = 0, cnt = 0, s = 0, f = 0, sum = 0, us[1002], head[1002], used[1002];void swap(node2 &a, node2 &b){    node2 t = a;    a = b;    b = t;}void dijkstar(){    int i = 0, j = 0, p = 0, v = 0, w = 0, k = 0, flag = 0, min = 0;    dist[0][0].sum = inf;    dist[s][0].sum = 0;    dist[s][0].cnt = 1;    while(1)    {        k = 0;        min = inf;        for(i = 1; i<=n; i++)//应该先更新完最短路在的条数在更新次短路, 每回选出当前更新状态的最短距离        {            if(us[i] == 0 && dist[i][0].sum<min)            {                k = i;                min = dist[i][0].sum;            }            else if(us[i] == 1 && dist[i][1].sum<min)            {                min = dist[i][1].sum;                k = i;            }        }        if(k == 0) return ;//表示当前已没有路, 必须要有这个判断, 不然超时        if(k == f && us[k] == 1) return ;//只要一满足这个条件, 终点的最短路与此短路必定统计完了,此时结束        for(p = head[k]; p != -1; p = edge[p].next)        {            v = edge[p].v;            w = edge[p].w;            if(us[v]<3 && dist[k][us[k]].sum+w < dist[v][2].sum)//小于第三短路            {                dist[v][2].sum = dist[k][us[k]].sum+w;                dist[v][2].cnt = dist[k][us[k]].cnt;                flag = 0;                for(j = 0; j<2; j++)//看这点是否出现过                {                    if(dist[v][j].sum==dist[v][2].sum)                    {                        flag = 1;                        dist[v][j].cnt += dist[v][2].cnt;                        dist[v][2].sum = inf;                        dist[v][2].cnt = 0;                        break;                    }                }                if(!flag)//如果没有出现过,把他更新到正确距离                {                    for(j = 2; j>0; j--)//调整最短路, 次短路                        if(dist[v][j].sum<dist[v][j-1].sum)                            swap(dist[v][j], dist[v][j-1]);                }            }        }        us[k]++;    }}int main(){    int i = 0, j = 0, t = 0, u = 0, v = 0, w = 0;    scanf("%d", &t);    while(t--)    {        cnt = 0;        for(i = 0; i<1002; i++)        {            head[i] = -1;            us[i] = 0;            for(j = 0; j<4; j++)            {                dist[i][j].sum = inf;                dist[i][j].cnt = 0;            }        }        scanf("%d %d", &n, &m);        for(i = 0; i<m; i++)        {            scanf("%d %d %d", &u, &v, &w);            edge[cnt].v = v;            edge[cnt].next = head[u];            edge[cnt].w = w;            head[u] = cnt++;        }        scanf("%d %d", &s, &f);        dijkstar();        if(dist[f][1].sum-dist[f][0].sum == 1)            printf("%d\n", dist[f][1].cnt+dist[f][0].cnt);        else            printf("%d\n", dist[f][0].cnt);    }    return 0;}


原创粉丝点击