1. 程式人生 > >最短路徑 oj

最短路徑 oj

 “師創杯”山東理工大學第五屆ACM程式設計競賽
#include <stdio.h>  
#define MAX 223372036854775807  
long long map[100][100],d[100][10]; //map存圖,d存每個點不同情況的狀態  
int vi[100][10];    //每個點的各種狀態是否遍歷過  
void dij(int u,int v,int x,int n)  
{  
    int i,i1,pos,pos1,x1;  
    long long t;  
    for(i=0;n>i;i++)  
    {  
        for(i1=0;x>i1;i1++)  
        {  
            d[i][i1]=MAX;  
            vi[i][i1]=0;  
        }  
    }  
    d[u][0]=0;  
    while(vi[v][0]==0)  
    {  
        t=MAX;  
        pos=-1;  
        for(i=0;n>i;i++)  
        {  
            for(i1=0;x>i1;i1++)  
            {  
                if(vi[i][i1]==0&&t>d[i][i1])  
                {  
                    t=d[i][i1];  
                    pos=i;  
                    pos1=i1;  
                    x1=(i1+1)%x;    //步數記錄  
                }  
            }  
        }  
        if(pos==-1)  
        {  
            break;  //起點到終點沒有連通  
        }  
        vi[pos][pos1]=1;  
        for(i=0;n>i;i++)  
        {  
            if(vi[i][x1]==0&&d[i][x1]>t+map[pos][i])  
            {  
                d[i][x1]=t+map[pos][i];  
            }  
        }  
    }  
}  
int main()  
{  
    int i,t,n,m,i1,i2,u,v,w,x;  
    scanf("%d",&t);  
    for(i=1;t>=i;i++)  
    {  
        scanf("%d %d",&n,&m);  
        for(i1=0;n>i1;i1++)  
        {  
            for(i2=0;n>i2;i2++)  
            {  
                map[i1][i2]=MAX;  
            }  
        }  
        for(i1=1;m>=i1;i1++)  
        {  
            scanf("%d %d %d",&u,&v,&w);  
            if(map[u][v]>w)      //防止重邊  
            {  
                map[u][v]=w;  
            }  
        }  
        scanf("%d %d %d",&u,&v,&x);  
        dij(u,v,x,n);       //Dijkstra演算法  
        if(d[v][0]!=MAX)  
        {  
            printf("%lld\n",d[v][0]);  
        }  
        else  
        {  
            printf("No Answer!\n");  
        }  
    }  
    return 0;  
}