SDUT 2622 最短路径(Dijkstra)

点我看题目

题意 :中文不详述。

思路 :因为这个题加了一个要求就是路径数目得是x的倍数。所以在原来算法的一维dis数组增加到二维,用来存走的路径数%x。也可以用spfa做。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>

using namespace std ;

#define LL long long
const int maxn = 110 ;
const int maxm = 10010 ;
bool vis[maxn][maxn] ;
const LL INF = 1LL<<60 ;
int cnt = 0 ;
int head[maxn] ;
LL dist[maxn][maxn] ;
int n , m ;

struct node
{
    int u,v,w ;
    int next ;
}Edge[maxm] ;

void addedge(int u,int v,int w)
{
    Edge[cnt].u = u ;
    Edge[cnt].v = v ;
    Edge[cnt].w = w ;
    Edge[cnt].next = head[u]  ;
    head[u] = cnt++ ;
}

LL dijkstra(int s,int t,int x)
{
    for(int i = 0 ; i < n ; i++)
    for(int j = 0 ; j < x ; j++)
    {
        dist[i][j] = INF ;
        vis[i][j] = false ;
    }
    dist[s][0] = 0 ;
    while(true)
    {
        LL minn = INF ;
        int u = -1 ;
        int flag , xx ;
        for(int i = 0 ; i < n ; i++)
        {
            for(int j = 0 ; j < x ; j++)
            {
                if(!vis[i][j] && minn > dist[i][j])
                {
                    minn = dist[i][j] ;
                    u = i ;
                    flag = j ;
                    xx = (flag+1)%x ;
                }
            }
        }
        if(u == -1) return -1 ;
        vis[u][flag] = true ;
        if(vis[t][0]) return dist[t][0] ;
        for(int j = head[u] ; j  != -1 ; j = Edge[j].next)
        {
            int v = Edge[j].v ;
            if(!vis[v][xx] && minn + Edge[j].w < dist[v][xx])
            dist[v][xx] = minn + Edge[j].w ;
        }
    }
}
int main()
{
    int T,s,t,x ;
    scanf("%d",&T) ;
    while(T--)
    {
        cnt = 0 ;
        memset(head,-1,sizeof(head)) ;
    //    memset(vis,false,sizeof(vis) ) ;
        scanf("%d %d",&n,&m) ;
        int u,v, w ;
        for(int i = 0 ; i < m ; i++)
        {
            scanf("%d %d %d",&u,&v,&w) ;
            addedge(u,v,w) ;
        }
        scanf("%d %d %d",&s,&t,&x) ;
        LL ans = dijkstra(s,t,x) ;
        if(ans != -1)
            printf("%lld
",dist[t][0]) ;
        else printf("No Answer!
") ;
    }
    return 0 ;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3621844.html