POJ 3268 最短路应用
2024-08-30 23:27:57
题意很简单 正向图跑一遍SPFA 反向图再跑一边SPFA 找最大值即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
const int maxn=1000+1,maxm=100000+1,INF=1e+8;
int len[maxn][maxn],len1[maxn][maxn],dist[maxn],dist1[maxn];
vector<int> path[maxn],path1[maxn];
int n,m,source;
void SPFA(int dist[],int d[][maxn],vector<int>son[],int source)
{
bool inq[maxn];
int times[maxn];
memset(inq,0,sizeof(inq));
memset(times,0,sizeof(times));
for(int i=1;i<=n;i++)
dist[i]=INF;
dist[source]=0;
queue<int>q;
q.push(source);
times[source]++;
inq[source]=true;
while(!q.empty())
{
int now=q.front();
q.pop();
inq[now]=false;
for(int i=0;i<son[now].size();i++)
{
int np=son[now][i];
if(dist[np]>dist[now]+d[now][np])
{
dist[np]=dist[now]+d[now][np]; if(times[np]>n)return;
if(!inq[np]){times[np]++;q.push(np);}
}
}
}
} int main()
{freopen("t.txt","r",stdin);
scanf("%d%d%d",&n,&m,&source);
for(int i=0;i<m;i++)
{
int a,b,l;
scanf("%d%d%d",&a,&b,&l);
path[a].push_back(b);len[a][b]=l;
path1[b].push_back(a);len1[b][a]=l;
}
SPFA(dist,len,path,source);
SPFA(dist1,len1,path1,source);
int ans=0;
for(int i=1;i<=n;i++)
{
if((dist[i]+dist1[i])>ans)ans=dist[i]+dist1[i];
}
printf("%d\n",ans);
return 0;
}
最新文章
- MySQL 事物控制和锁定语句
- 发邮件 和 excel导出中文文件名
- MSSQL 和 REDIS的数据类型对应关系
- AT&;T ASSEMBLY FOR LINUX AND MAC (SYS_FORK)
- android 事件
- 【转】Entity Systems
- iOS之Sqlite和FMDB
- 开发备必:WEB前端开发规范文档
- Linux系统编程初探系列之一:文件编程
- Spring 与 mybatis整合 Error parsing Mapper XML. Cause: java.lang.NullPointerException
- leetcode range sum query
- Java第十四周学习总结
- 技术笔记1:java.sql.SQLException: Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password)
- white-space:pre-wrap和word-break:break-all;
- 受欢迎的牛 [HAOI2006] [强连通] [传递闭包(划)]
- axios基础
- JAVA框架Struts2 Action类
- Java 多线程(三)之线程状态及其验证
- docker容器日志在哪?以及清理命令
- 在 Linux服务器中安装 Python 3.6