您的位置:首页 > 其它

spfa模板 和 拓扑排序 模板(HDU1874 和 HDU3342)

2015-08-16 23:51 423 查看
<pre name="code" class="cpp">//SPFA模版://HDU   1874#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <string>#include <vector>#include <cmath>#include <ctime>#include <queue>#include <stack>#include <set>#include <map>using namespace std;typedef __int64 LL;const int mx = 2e5 + 5;const int inf = 0x3f3f3f3f;int n,m,mp[1001][1001],d[1001];bool visit[201];void init() {    for(int i=0; i<=n; i++)        for(int j=0; j<=n; j++)            mp[i][j]=inf;    for(int i=0; i<=n; i++)        d[i]=inf,visit[i]=0;}void spfa(int s) {    queue<int> k;    k.push(s);    d[s]=0;    visit[s]=1;    while(!k.empty()) {        int h=k.front();        k.pop();        visit[h]=0;        for(int i=0; i<n; i++) {            if(d[i]-mp[h][i]>d[h]) {                d[i]=mp[h][i]+d[h];                if(!visit[i]) {                    k.push(i);                    visit[i]=1;                }            }        }    }}int main() {    while(scanf("%d%d",&n,&m)!=EOF) {        init();        int x,y,w;        for(int i=0; i<m; i++) {            scanf("%d%d%d",&x,&y,&w);            mp[x][y]=mp[y][x]=(w<mp[x][y]?w:mp[x][y]);        }        int s,t;        scanf("%d%d",&s,&t);        spfa(s);        if(d[t]==inf) puts("-1");        else printf("%d\n",d[t]);    }    return 0;}
//HDU3342(拓扑排序模版)#include<cstdio>#include<cstring>#include<set>using namespace std;struct khp {    int in;    set<int> k;};khp y[101];bool final[101];int n,m;bool topu() {    int t,s=0,i,j;    bool judge=0;    for(i=0; i<n; i++)        if(y[i].in==0) {            t=i;            break;        }    if(i==n) return 0;    final[t]=1;    while(s<n) {        judge=0;        for(set<int>::iterator it=y[t].k.begin(); it!=y[t].k.end(); it++)            y[*it].in--;        for(i=0; i<n; i++)            if(y[i].in==0&&!final[i]) {                t=i;                s++;                final[t]=1;                judge=1;                break;            }        if(!judge)            break;    }    if(s!=n-1)        return 0;    else return 1;}int main() {    int i,j,a,b;    while(scanf("%d%d",&n,&m)!=EOF) {        for(i=0; i<101; i++) {            final[i]=0;            y[i].in=0;            y[i].k.clear();        }        if(!n&&!m) break;        for(i=0; i<m; i++) {            scanf("%d%d",&a,&b);            if(!y[b].k.count(a)) {                y[b].k.insert(a);                y[a].in++;            }        }        bool judge=topu();        if(!judge)            puts("NO");        else puts("YES");    }    return 0;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: