| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:关于用spfa,为什么我开的数组大小不同,结果不同In Reply To:关于用spfa,为什么我开的数组大小不同,结果不同 Posted by:16202120 at 2017-06-12 16:08:50 > #include<iostream>
> #include<cstdio>
> #include<cmath>
> #include<algorithm>
> #include<vector>
> #include<queue>
> #include<cstring>
> using namespace std;
> #define M 5205 //ac
> //#define M 3000 runtime error
> //#define M 5000 wrong answer
> #define N 505
>
> struct node {
> int p,next,dis;
> } g[M];
> int n,m,w,cnt[N],inq[N],head[N],dis[N],k;
>
> void addEdge(int s,int d,int dist) {
> g[k].p=d;
> g[k].dis=dist;
> g[k].next=head[s];
> head[s]=k++;
> }
> bool spfa(int s) {
> memset(dis,0x3f3f3f3f,sizeof(dis));
> memset(inq,0,sizeof(inq));
> memset(cnt,0,sizeof(cnt));
> queue<int> q;
> q.push(s);
> cnt[s]=1;
> inq[s]=1;
> while(!q.empty()) {
> int t=q.front();
> q.pop();
> inq[t]=0;
> for(int i=head[t],p; i!=-1; i=g[i].next) {
> p=g[i].p;
> if(dis[p]>dis[t]+g[i].dis) {
> dis[p]=dis[t]+g[i].dis;
> if(!inq[p]) {
> q.push(p);
> inq[p]=1;
> if(++cnt[p]>n)
> return true;
> }
> }
> }
> }
> return false;
> }
> int main() {
> freopen("in.txt","r",stdin);
> int f;
> cin>>f;
> while(f--) {
> cin>>n>>m>>w;
> memset(head,-1,sizeof(head));
> k=0;
> for(int i=0,a,b,d; i<m; i++) {
> scanf("%d%d%d",&a,&b,&d);
> addEdge(a,b,d);
> addEdge(b,a,d);
> }
> for(int i=0,a,b,d; i<w; i++) {
> scanf("%d%d%d",&a,&b,&d);
> addEdge(a,b,-d);
> }
> int ok=0;
> for(int i=1; i<=n; i++) {
> if(spfa(i)) {
> ok=1;
> break;
> }
> }
> if(ok)
> cout<<"YES\n";
> else
> cout<<"NO\n";
> }
> return 0;
> }
懂了。。
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator