hdu1595(枚举+最短路,Dijkstra/SPFA)

来源:互联网 发布:呼叫中心软件系统 编辑:程序博客网 时间:2024/04/27 07:58

题目链接:hdu1595

Dijkstra:515MS

/*题意:    求删掉任意一条边的最长最短路思路:    首先求出最短路,同时记录下路径,接着枚举最短路上每一条边(将此边切段),在求最短路,求这些最短路中的最长路*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <map>#include <queue>using namespace std;const int inf = 0x3f3f3f3f;const int MAX = 1005;const int MAXE = 5*1e5;int mp[MAX][MAX];int dis[MAX];bool use[MAX];int pre[MAX];int ans, n;void Dijkstra(int s,int e,bool flag){    typedef pair<int, int > pii;    priority_queue< pii, vector<pii>, greater<pii> > q;    fill(dis, dis+n+1, inf);    dis[s] = 0;    if(flag) pre[s] = -1;    q.push(make_pair(dis[s],s));    while(!q.empty())    {        pii tmp = q.top();        q.pop();        int u = tmp.second;        if(tmp.first != dis[u]) continue;        for(int v = 1; v <= n; v ++)        {            if(mp[u][v] && dis[v] > dis[u] + mp[u][v])            {                dis[v] = dis[u] + mp[u][v];                if(flag) pre[v] = u;                q.push(make_pair(dis[v],v));            }        }    }    if(flag) return;    if(dis[e] < inf)        ans = max(ans, dis[e]);}void solve(){    int e = n;    while(pre[e] != -1)//枚举每条边    {        int tmp = mp[e][pre[e]];        mp[e][pre[e]] = mp[pre[e]][e] = 0;//将两边关系切断        Dijkstra(1, n, false);        mp[e][pre[e]] = mp[pre[e]][e] = tmp;        e = pre[e];    }    printf("%d\n",ans);}int main(){    int m;    while(~scanf("%d%d",&n,&m))    {        int u, v, c;        memset(mp, 0, sizeof(mp));        while(m--)        {            scanf("%d%d%d",&u,&v,&c);            mp[u][v] = mp[v][u] = c;        }        ans = 0;        Dijkstra(1, n, true);        solve();    }    return 0;}


SPFA:4484MS

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <map>#include <queue>using namespace std;const int inf = 0x3f3f3f3f;const int MAX = 1005;const int MAXE = 5*1e5;const int N = 1005;int mp[N][N];int dis[MAX];bool use[MAX];int pre[MAX];int ans, n;void SPFA(int s, int e, bool flag){    fill(dis, dis+n+1, inf);    fill(use, use+n+1, false);    queue<int> q;    dis[s] = 0;    if(flag) pre[s] = -1;    use[s] = true;    q.push(s);    while(!q.empty())    {        int u = q.front();        q.pop();        use[u] = false;        for(int v = 1; v <= n; v ++)        {            if(mp[u][v] && dis[v] > dis[u] + mp[u][v])            {                dis[v] = dis[u] + mp[u][v];                if(flag) pre[v] = u;                if(!use[v])                {                    use[v] = true;                    q.push(v);                }            }        }    }    if(flag) return;    if(dis[e] < inf)        ans = max(ans, dis[e]);}void solve(){    int e = n;    while(pre[e] != -1)    {        int tmp = mp[e][pre[e]];        mp[e][pre[e]] = mp[pre[e]][e] = 0;        SPFA(1, n, false);        mp[e][pre[e]] = mp[pre[e]][e] = tmp;        e = pre[e];    }    printf("%d\n",ans);}int main(){    int m;    while(~scanf("%d%d",&n,&m))    {        int u, v, c;        memset(mp, 0, sizeof(mp));        while(m--)        {            scanf("%d%d%d",&u,&v,&c);            mp[u][v] = mp[v][u] = c;        }        ans = 0;        SPFA(1, n, true);        solve();    }    return 0;}


0 0
原创粉丝点击