HDU1595(枚举+最短路(dijkstra))

来源:互联网 发布:gamestop it 编辑:程序博客网 时间:2024/04/19 04:55

题意不多说了。。思路就是先走一遍dijkstra,然后p数组记录下路径,然后枚举路径上的边删去之后走dijkstra得到的最短路(想想为什么?我当时做的时候是枚举了图每条边,然后就超时),取最大值。


#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>#include <string>#include <vector>#define maxn 1005#define INF 999999999using namespace std;int n,m;int map[maxn][maxn];int dis[maxn];int vis[maxn];int p[maxn];void dijkstra(int f){    int i,j,mini,flag;    for(i=1;i<=n;i++)        dis[i]=INF;    dis[1]=0;    memset(vis,0,sizeof(vis));    for(i=1;i<=n;i++)    {        mini=INF;        for(j=1;j<=n;j++)        {            if(!vis[j] && dis[j]<mini)            {                mini=dis[j];                flag=j;            }        }        if(mini==INF)            return;        vis[flag]=true;        for(j=1;j<=n;j++)        {            if(!vis[j] && map[flag][j]+dis[flag]<dis[j]){                dis[j]=map[flag][j]+dis[flag];if(f)p[j]=flag;}        }    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {memset(p,0,sizeof(p));        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                map[i][j]=INF;                map[i][i]=0;            }        }        for(int i=0;i<m;i++)        {            int u,v,l;            scanf("%d%d%d",&u,&v,&l);            if(map[u][v]>l)            {                map[u][v]=map[v][u]=l;            }        }dijkstra(1);int Max=dis[n];for(int i=n;i!=1;i=p[i]){int t=map[i][p[i]];map[i][p[i]]=map[p[i]][i]=INF;dijkstra(0);Max=max(Max,dis[n]);map[i][p[i]]=map[p[i]][i]=t;}        printf("%d\n",Max);    }    return 0;}/*5 61 2 41 3 32 3 12 4 42 5 74 5 16 71 2 12 3 43 4 44 6 41 5 52 5 25 6 55 71 2 81 4 102 3 92 4 102 5 13 4 73 5 10*/


0 0