zoj 2923 Calculate Roads
来源:互联网 发布:手机淘宝分销平台在哪 编辑:程序博客网 时间:2024/05/09 20:57
数组开小了, 给我TLE。。
找了一个小时的错。。不过也怪自己太粗心了
题意大概是 如果满足是 最短路&&虫子的数量不超过k,就算一种路线。。 叫你输出有多少条最短路
一定要满足 最短路。。开始的时候题意理解错了
dijkstra算法
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<queue>#include<map>#include<set>using namespace std;#define inf 0x3f3f3f3f#define eps 1e-8#define LL long long #define ull unsigned long long#define MP make_pair#define mnx 2000200 //这里写成一百万了,应该要两百万 (双向边) #define mxn 5005int first[mnx], nxt[mnx], vv[mnx], dis[mxn], e;int num[mxn], cnt[mxn], insect[mxn]; //num[i] 记录每个点i的虫子数,cnt[i]满足题目条件到达i的最短路数,insect[i] 从起点到点i的总虫子数 bool vis[mxn];int m, n, k;struct node{ int d, num; bool operator > ( const node &b ) const { return d > b.d; }};void init (){ memset(first, -1, sizeof(first)); memset(dis, 0x3f, sizeof(dis)); memset(vis, 0, sizeof(vis)); memset(cnt, 0, sizeof(cnt)); memset(insect, 0, sizeof(insect)); e = 0;}void add( int u, int v ){ vv[e] = v; nxt[e] = first[u]; first[u] = e++;}void dijkstra( int s ){ priority_queue< node, vector<node>, greater<node> > que; node q; q.num = 1, q.d = 0; dis[1] = 0, insect[1] = num[1], cnt[1] = 1; que.push(q); while( !que.empty() ){ node q1 = que.top(); que.pop(); if(vis[q1.num] ) continue; vis[q1.num] = 1; for( int i = first[q1.num]; i != -1; i = nxt[i] ){ int v = vv[i]; if ( dis[v] >= dis[q1.num] + 1 && num[v] + insect[q1.num] <= k){ // 注意条件dis[v] >= dis[q1.num]+1 dis[v] = dis[q1.num] + 1; node q2; q2.num = v, q2.d = dis[v]; cnt[v] += cnt[q1.num]; insect[v] = num[v] + insect[q1.num]; que.push(q2); } } }}int main(){ while( scanf("%d%d%d", &m, &n, &k) != EOF ){ init(); int u, v; for( int i = 0; i < n; i++ ){ scanf("%d%d", &u, &v); num[u] = v; } for( int i = 0; i < m; i++ ){ scanf("%d%d", &u, &v); add(u, v); add(v, u); } dijkstra( 1 ); if( cnt[n] == 0 )printf("Impossible!\n"); else printf("%d\n", cnt[n]); } return 0;}bfs 照着别人的代码写的。。写的真好
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<queue>#include<map>#include<set>using namespace std;#define inf 0x3f3f3f3f#define eps 1e-8#define LL long long #define ull unsigned long long#define MP make_pair#define mnx 5055 int num[mnx];bool g[mnx][mnx], vis[mnx]; //把g[][]改为int型,会爆内存。。这里也是个坑啊 int m, n, k, cnt;struct node{int v, insect, deep;};void init(){memset(vis, 0, sizeof(vis));memset(g, 0, sizeof(g));cnt = 0;}void bfs(){queue<node> que;int xx = inf;node q;q.v = 1, q.insect = num[1], q.deep = 0;que.push(q);while( !que.empty() ){node q1 = que.front(); que.pop();if( q1.deep > xx ) break; // 直接break,队列里的其他元素的deep肯定大于xx for( int i = 1; i <= n; i++ ){if( !vis[i] && g[q1.v][i] && q1.insect + num[i] <= k ){if( i == n ){cnt++; xx = q1.deep; continue; }node q2;q2.v = i, q2.insect = q1.insect + num[i], q2.deep = q1.deep+1;que.push(q2);}}vis[q1.v] = 1;} }int main(){ while( scanf("%d%d%d", &m, &n, &k) != EOF ){ init(); int u, v; for( int i = 0; i < n; i++ ){ scanf("%d%d", &u, &v); num[u] = v; } for( int i = 0; i < m; i++ ){ scanf("%d%d", &u, &v); g[u][v] = 1; g[v][u] = 1; } bfs(); if( cnt == 0 )printf("Impossible!\n"); else printf("%d\n", cnt); } return 0;}
0 0
- zoj 2923 Calculate Roads
- ZOJ 1113 u Calculate e
- ZOJ - 3179 Calculate With Abacus
- zoj 3179 - Calculate With Abacus
- ZOJ 3179 Calculate With Abacus
- zoj 1113 u Calculate e
- ZOJ 1113 u Calculate e
- zoj 3179 Calculate With Abacus
- ZOJ 1113: u Calculate e
- ZOJ 3772 Calculate the Function
- ZOJ 3772 Calculate the Function
- ZOJ 1113 u Calculate e
- Zoj 3707 calculate prime s
- zoj 3772 Calculate the Function
- zoj 3707 Calculate Prime S
- ZOJ 3707Calculate Prime S
- zoj 1406 Jungle Roads
- ZOJ 1406.Jungle Roads
- 推荐移动开发者必看的微信公众账号vjiazhi,摆脱屌丝!
- ArrayList方法介绍
- muduo源码分析--数据在muduo中的旅程
- Android生命周期练习
- C#中动态执行代码
- zoj 2923 Calculate Roads
- 将txtview中某些字符替换为图片
- tomcat如何配置懒加载 每次更改不用重新启动服务器
- 机房收费系统总结三:代码设计
- 制作linux U盘安装
- dos 中tree的使用方法
- JAVA 容器--比较大小与比较重复(2)
- Java学习笔记 - 04
- HDU1176免费馅饼