//POJ2679
//DFS+SPFA+邻接表
//只能走每个点费用最小的边,相同则需保证距离最短
//求最小费用及最短距离
//Time:47Ms Memory:900K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; #define MAXN 1105
#define MAXM 5005
#define INF 0x3f3f3f3f struct Edge{
int v,len,fee,next;
Edge(){}
Edge(int vv,int ll,int ff, int nn):v(vv),len(ll),fee(ff),next(nn){}
}e[2*MAXM]; int n,m;
int dept,dest;
int h[MAXN], le;
int minfee[MAXN], minFee[MAXN];
int vis[MAXN];
int d[MAXN], cnt[MAXN]; void add(int u, int v,int w,int fuv,int fvu)
{
e[le] = Edge(v, w, fuv, h[u]); h[u] = le++;
e[le] = Edge(u, w, fvu, h[v]); h[v] = le++;
} bool dfs(int x) //判定从x是否可达终点
{
vis[x] = true;
if(x == dest) return true;
if(minfee[x] == INF) return false;
for(int i = h[x]; i != -1; i = e[i].next)
{
if(!vis[e[i].v] && minfee[x] == e[i].fee){
if(dfs(e[i].v)) return true;
vis[e[i].v] = false;
}
}
return false;
} bool spfa(int x)
{
memset(d,INF,sizeof(d));
memset(vis,false,sizeof(vis));
memset(cnt, 0, sizeof(cnt));
memset(minFee, 0, sizeof(minFee));
queue<int> q;
q.push(x); vis[x] = true;
cnt[x] = 1; d[x] = 0; minFee[x] = 0;
while(!q.empty()){
int cur = q.front();
q.pop(); vis[cur] = false;
for(int i = h[cur]; i != -1; i = e[i].next)
{
if(minfee[cur] != e[i].fee) continue;
int v = e[i].v, w = e[i].len;
if(minFee[v] > minFee[cur] + minfee[cur] ||
d[v] > d[cur] + w) //先判断费用更小,再判断距离更小
{
minFee[v] = minFee[cur] + minfee[cur];
d[v] = d[cur] + w;
if(!vis[v]){
vis[v] = true;
if(++cnt[v] > n) //成环
{
if(dfs(v)) return false; //可达终点
else continue; //不可达终点
}
q.push(v);
}
}
}
}
return true;
} int main()
{
//freopen("in.txt", "r", stdin); while(~scanf("%d%d%d%d", &n,&m,&dept,&dest))
{
memset(h,-1,sizeof(h));
memset(minfee,INF,sizeof(minfee));
le = 0;
char cmd[100];
int u,v,w,fuv,fvu;
for(int i = 0; i < m; i++)
{
scanf("%s", cmd);
sscanf(cmd, "(%d,%d,%d[%d]%d)", &u,&v,&fuv,&w,&fvu);
add(u,v,w,fuv,fvu);
minfee[u] = min(minfee[u], fuv);
minfee[v] = min(minfee[v], fvu);
} memset(vis,false,sizeof(vis));
bool VOID = !dfs(dept);
if(VOID){ //没有路径可达
printf("VOID\n");
continue;
}
bool UNBOUND = !spfa(dept); //可达路径中存在负权费用环路
if(UNBOUND) printf("UNBOUND\n");
else printf("%d %d\n", minFee[dest], d[dest]);
} return 0;
}

ACM/ICPC 之 DFS+SPFA-贪心+最短路(POJ2679)的更多相关文章

  1. 2017 ACM/ICPC Shenyang Online SPFA+无向图最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  2. ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)

    判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径 //Time:16Ms Memory:228K #include<iostream> #include<cstring& ...

  3. ACM/ICPC 之 DFS求解欧拉回路+打表(POJ1392)

    本题可以通过全部n位二进制数作点,而后可按照某点A的末位数与某点B的首位数相等来建立A->B有向边,以此构图,改有向图则是一个有向欧拉回路,以下我利用DFS暴力求解该欧拉回路得到的字典序最小的路 ...

  4. ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

    //转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring ...

  5. ACM/ICPC 之 DFS范例(ZOJ2412-ZOJ1008)

    通过几道例题简单阐述一下DFS的相关题型 ZOJ2412-Farm Irrigation 直观的DFS题型,稍加变化,记录好四个方向上的通路就能够做出来 题目和接水管类似,问最少要灌溉几次,即求解最少 ...

  6. HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)

    Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)To ...

  7. 2017 ACM/ICPC Asia Regional Shenyang Online spfa+最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  8. ACM - 最短路 - AcWing 851 spfa求最短路

    AcWing 851 spfa求最短路 题解 以此题为例介绍一下图论中的最短路算法 \(Bellman\)-\(Ford\) 算法.算法的步骤和正确性证明参考文章最短路径(Bellman-Ford算法 ...

  9. hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)

    Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

随机推荐

  1. Apache问题处理服务器访问不了

    1. 查看apache的错误日志 我的apache日志文件目录 /var/log/httpd/error.log [Sun Nov 20 21:17:24 2016] [error] server r ...

  2. visual studio 2013 使用域名调试本地项目

    一.在localhost添加需要指定的域名,如:test.domain.com 二.以管理员身份启动VS,并打开项目 三.修改IIS Express的配置文件(一般位于:C:\Users\当前用户\D ...

  3. secureCRT

    配色方案 1

  4. PDF.NET内存数据库的使用小结

    深蓝医生的PDF.NET数据开发框架提供了一个建议的内存数据库功能,具体的功能介绍我就不多说了,可以看医生的博文<移花接木:当泛型方法遇上抽象类----我的“内存数据库”诞生记>. 我之所 ...

  5. the user operation is waiting

    eclipse在编辑完代码保存的时候,弹出一个进度框,等N长时间,标题是"user operation is waiting",里面显示的是building workspace的进 ...

  6. Python 【第十章】 Django路由

    路由可以简单理解就是 URL -> 函数名 例如: /login1/ -> 函数名 urls.py文件中 urlpatterns = [ # url(r'^admin/', admin.s ...

  7. iOS无限循环滚动scrollview

    经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播 ...

  8. 2016福州大学软件工程第五、六次团队作业-Alpha阶段成绩汇总

    1.本次作业成绩统计结果: 本次Alpha阶段团队作业公布如下: 表格说明: PE:贡献百分比 YS:演示评分(满分15分) BK:博客评分(满分15分) SH:事后诸葛亮环节(满分5分) P:个人分 ...

  9. Android View 的事件体系

    android 系统虽然提供了很多基本的控件,如Button.TextView等,但是很多时候系统提供的view不能满足我们的需求,此时就需要我们根据自己的需求进行自定义控件.这些控件都是继承自Vie ...

  10. Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、

    特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣)                       ...