zoj 2923 Calculate Roads

数组开小了, 给我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 5005
int 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值