1. 程式人生 > >UESTC30-最短路-Floyd最短路、spfa+鏈式前向星建圖

UESTC30-最短路-Floyd最短路、spfa+鏈式前向星建圖

ring 輸入 sam -m 努力 成都 edge 輸出 工作

最短路

Time Limit: 3000/1000MS (Java/Others)
Memory Limit: 65535/65535KB (Java/Others)

在每年的校賽裏,所有進入決賽的同學都會獲得一件很漂亮的T-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?

Input

輸入包括多組數據。

每組數據第一行是兩個整數NN ,MM (N100N≤100 ,M10000M≤10000 ),NN 表示成都的大街上有幾個路口,標號為11 的路口是商店所在地,標號為NN 的路口是賽場所在地,MM 則表示在成都有幾條路。

N=M=0N=M=0 表示輸入結束。

接下來MM 行,每行包括33 個整數AA ,BB ,CC (1A1≤A ,BNB≤N ,1C10001≤C≤1000 ),表示在路口AA 與路口BB 之間有一條路,我們的工作人員需要CC 分鐘的時間走過這條路。

輸入保證至少存在11 條商店到賽場的路線。

Output

對於每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間。

Sample input and output

Sample InputSample Output
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
3
2
題意好理解,就是最短路。 最短路。。。傳送門http://developer.51cto.com/art/201403/433874.htm 打訓練賽的時候這個題wa了7次,最後也沒寫對,也是沒誰了(;′д`)ゞ 代碼:
#include<bits/stdc++.h>
using
namespace std; const int N=100+10; const int INF=0x3f3f3f3f; typedef long long ll; int hh[N][N]; int n,m; int gg(){ //關鍵 for(int h=1;h<=n;h++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) //這裏當時寫錯了,j<=n寫成j<=m了。。。
hh[i][j]
=min(hh[i][j],hh[i][h]+hh[h][j]); } int main(){ int h,k,l; while(~scanf("%d%d",&n,&m)&&(n||m)){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) hh[i][j]=INF; for(int i=0;i<m;i++){ scanf("%d%d%d",&h,&k,&l); if(l<hh[h][k]) hh[h][k]=hh[k][h]=l; } gg(); printf("%d\n",hh[1][n]); } return 0; }

啊啊啊啊啊啊啊,還有一個思路可以寫,spfa算法+鏈式前向星建圖

然而,前向星有的看懂了,有的還很(O_O)?傳送門http://www.cnblogs.com/Tovi/p/6194786.html

人家的代碼,傳送門http://blog.csdn.net/lvshubao1314/article/details/23034601

代碼:

#include<string.h>
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
const int maxn=1e5+1;
const int INF=1e9;
struct node{
    int b,w,next;
};
node edge[maxn];
int s,n,ip;
int head[maxn],que[maxn],visit[maxn],dis[maxn];
void add(int u,int v,int c){
    edge[ip].b=v;edge[ip].w=c;edge[ip].next=head[u];head[u]=ip++;
}
void spfa(int start,int numpoint){
    memset(visit,0,sizeof(visit));
    for(int i=0;i<=numpoint;i++)
        dis[i]=INF;
    int front=-1,tail=-1;
    dis[start]=0;visit[start]=1;que[++tail]=start;
    int top,to,temp;
    while(front!=tail){
        if(++front>numpoint)front-=numpoint;
        top=que[front];visit[top]=0;
        for(int p=head[top];p!=-1;p=edge[p].next){
            to=edge[p].b;temp=dis[top]+edge[p].w;
            if(dis[to]>temp){
                dis[to]=temp;
                if(!visit[to]){
                    if(++tail>numpoint)tail-=numpoint;
                    que[tail]=to;
                    visit[to]=1;
                }
            }
        }
    }
}
int main(){
    int b,w,m,k;
    while(~scanf("%d%d",&n,&m)){
        if(m==0&&n==0)break;
        int maxx=-100;
        memset(head,-1,sizeof(head));
        ip=0;
        for(int i=1;i<=m;i++){
            cin>>k>>b>>w;
            if(k>maxx)maxx=k;
            if(b>maxx)maxx=b;
            add(k,b,w);
            add(b,k,w);
        }
        spfa(1,maxx);
        printf("%d\n",dis[n]);
    }
    return 0;
}

菜的掉渣,繼續努力TAT

UESTC30-最短路-Floyd最短路、spfa+鏈式前向星建圖