floyd算法求最短路径

给定一个 n个点 m 条边构成的无重边和自环的无向连通图。
点的编号为 1∼n。
请问:从 1到 n 的最短距离。去掉 k 条边后,从 1 到 n的最短距离。

输入格式
第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含三个整数 n,m,k。接下来 m行,每行包含三个整数 x,y,z,表示点 x 和点 y 之间存在一条长度为 z 的边。最后一行包含 k 个空格隔开的整数,表示去掉的边的编号。所有边按输入顺序从 1 到 m 编号。

输出格式
每组数据输出占两行。
第一行输出从 1到 n 的最短距离。
第二行输出去掉 k条边后,从 1 到 n 的最短距离。无法到达,则输出 −1。

数据范围
1≤T≤10,
1≤n≤50,
1≤m≤n(n−1)2,
1≤x,y≤n,
1≤z≤100,
1≤k≤m

输入样例:
1
4 4 1
1 2 1
2 3 1
3 4 1
1 4 1
4

输出样例:
1
3

#include
#include
using namespace std;
const int N=55,M=N*N/2,INF=0x3f3f3f3f;
int d[N][N],g[N][N];
int n,m,q;
struct edge{
    int a,b;
}e[M];
void floyd()
{
    memcpy(d,g,sizeof d);
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m>>q;
        memset(g,0x3f,sizeof g);
        for(int i=1;i<=n;i++) g[i][i]=0;
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            g[a][b]=g[b][a]=c;
            e[i].a=a,e[i].b=b;
        }
        floyd();
        cout<<d[1][n]<<endl;
        while(q--)
        {
            int t;
            cin>>t;
            int a=e[t].a,b=e[t].b;
            g[a][b]=g[b][a]=INF;
        }     
        floyd();
        if(d[1][n]==INF) cout<<"-1"<<endl;
        else cout<<d[1][n]<<endl;
    }
    return 0;
}          

你可能感兴趣的:(算法,c++)