链接:http://acm.hdu.edu.cn/showproblem.php?pid=1595
题意:从城市1到城市N,之间共有M条路,其中有一条路损坏了,问在损坏的路径影响到达城市N的最短路径长度的情况下的到达城市N的最长路径。
分析:先用spfa求出1到N的最短路径,然后枚举这些路径,假设这条路径损坏了,求1到N的最短路,然后找出最大的即可。(用邻接矩阵存储图会TLE,用邻接表90MS+。。。)
Source Code:
#include<iostream> #include<cstdio> #include<cmath> #include<queue> #include<cstring> #include<string> #include<cstdlib> using namespace std; const int N=1005; const int inf=0x3f3f3f3f; int path[N],first[N],dis[N]; struct node{ int v,w,next; }edge[N*N]; bool mark[N][N]; int n,m,cnt; int max(int a,int b) { return a>b?a:b; } void add(int u,int v,int w) { edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=first[u]; first[u]=cnt++; } void spfa() { path[1]=-1; bool flag[N]; queue<int>Q; memset(dis,inf,sizeof(dis)); memset(flag,false,sizeof(flag)); dis[1]=0; Q.push(1); flag[1]=true; while(!Q.empty()){ int u=Q.front(); Q.pop(); flag[u]=false; for(int i=first[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(dis[v]>dis[u]+edge[i].w){ dis[v]=dis[u]+edge[i].w; path[v]=u; if(!flag[v]){ flag[v]=true; Q.push(v); } } } } } int solve() { queue<int>QQ; bool flag[N]; memset(dis,inf,sizeof(dis)); memset(flag,false,sizeof(flag)); dis[1]=0; flag[1]=true; QQ.push(1); while(!QQ.empty()){ int u=QQ.front(); flag[u]=false; QQ.pop(); for(int i=first[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if((dis[v]>dis[u]+edge[i].w)&&(mark[u][v])){ dis[v]=dis[u]+edge[i].w; if(!flag[v]){ flag[v]=true; QQ.push(v); } } } } return dis[n]; } int main() { //freopen("in.txt","r",stdin); int u,v,w,i; while(scanf("%d %d",&n,&m)!=EOF){ cnt=0; memset(mark,false,sizeof(mark)); memset(first,-1,sizeof(first)); for(i=1;i<=m;i++){ scanf("%d %d %d",&u,&v,&w); add(u,v,w); add(v,u,w); mark[u][v]=mark[v][u]=true; } spfa(); int ans=dis[n]; for( i=n;i!=-1;i=path[i]){ mark[i][path[i]]=mark[path[i]][i]=false; ans=max(ans,solve()); mark[i][path[i]]=mark[path[i]][i]=true; } printf("%d\n",ans); } //system("pause"); return 0; }