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
原创粉丝点击