最难的工作 /// SPFA模板 oj1396

题目大意:

Input

第一行是一个整数T ( T ≤ 100 ),表示测试用例的个数。

每个测试用例的第一行是两个整数 n 和 m ( 1 ≤ n ≤ 200 , 0 ≤ m ≤ 10000 ),分别表示交汇点的个数以及路的条数。

接下来的m行都有3个整数 i, j, k,表示在城市i 和城市j 之间有一条长度为k的路。

假设交汇点从1到n编号。你的出发点是1,目的地是n。

道路都是双向的。

Output

每个测试用例输出一行,一个整数:逃跑的最短距离。如果无路可逃,输出-1。

Sample Input

1
2 1
1 2 3

Sample Output

3

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define P pair<int,int>
#define mp(i,j) make_pair(i,j)
using namespace std;
struct NODE { int to,co; };
int a[205][205];
int dis[205],flag[205];
int main()
{
    int t;
    while(~scanf("%d",&t)) {
        while(t--) {
            int n,m; scanf("%d%d",&n,&m);
            memset(a,INF,sizeof(a));
            while(m--) {
                int u,v,w; scanf("%d%d%d",&u,&v,&w);
                a[u][v]=a[v][u]=min(a[u][v],w);
            }
            memset(dis,INF,sizeof(dis));
            memset(flag,0,sizeof(flag));
            queue <P> q;
            q.push(mp(0,1)); dis[1]=0; flag[1]=1;
            while(!q.empty()) {
                P u=q.front(); q.pop();
                flag[u.second]=0; /// 出队 标为0
                for(int i=1;i<=n;i++) {
                    if(flag[i] || a[u.second][i]==INF)
                        continue; /// 已在队列内 或两点间不存在路径
                    if(dis[i]>u.first+a[u.second][i]) {
                        dis[i]=u.first+a[u.second][i];
                        flag[i]=1; /// 入队 标为1
                        q.push(mp(dis[i],i));
                    } /// 更新最短路
                }
            }
            if(dis[n]==INF) printf("-1
");
            else printf("%d
",dis[n]);
        }
    }

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zquzjx/p/9148067.html