p3905题解

· · 题解

2325131433448687~

这道题居然没有floyd的题解,蒟蒻表示愤愤不平,100的数据都没人写floyd,那我就来水一发2333。。。

神奇代码:

#include <bits/stdc++.h>

using namespace std;
int h[105][105],d[105][105];
void floyd(int n)
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                h[i][j]=min(h[i][j],h[i][k]+h[k][j]);
}//floyd的板子,floyd的特点就是思路清晰,代码精简,所以很适合我这样听不懂dijkstra和spfa的蒟蒻使用。。。    

int main()
{
    memset(h,0x3f3f3f3f,sizeof(h));//一拜初始化
    int n,m,k;
    cin >> n >> m;
    for(int i=1;i<=m;i++)
    {
        int s,e;
        cin >> s >> e;
        cin >> d[s][e];
        d[e][s]=d[s][e];
        h[s][e]=h[e][s]=0;
    }//二拜建图(注意是双向边,建成单向边会瞬间爆炸。。。)
    cin >> k;
    for(int i=1;i<=k;i++)
    {
        int s,e;
        cin >> s >> e;
        h[s][e]=h[e][s]=d[s][e];//三拜删边(2333)
    }
    floyd(n);//套板子喽!真香。。。
    int st,en;
    cin >> st >> en;
    cout << h[st][en];//愉快地输出,最后祝大家NOIP进复赛!
    return 0;
    //2325131433448687
}