ce了这么多次居然都没发现交错语言了 嗷嗷啊~~!@#¥%……&*
【题意】给一张有向图 求从s点出发到t点话费的最少时间 每段路都有一个开放的时间和一个关闭是时间
只要在走那一段路的时候 判断一下要等待多长时间 就行了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<vector> 5 #include<math.h> 6 #include<string> 7 #include<queue> 8 #define maxx 100000000 9 10 using namespace std; 11 struct node{int t;int a;int b;int w;}; 12 vector<node > g[1002]; 13 bool vis[1002]; 14 int d[1002],n; 15 queue<int > q; 16 int spfa(int s,int ans) 17 { 18 19 memset(vis,false,sizeof(vis));q.push(s); vis[s]=true; 20 for(int i=0;i<=n;i++) 21 d[i]=maxx; 22 d[s]=0; 23 while(!q.empty()) 24 { 25 int u; 26 u=q.front(); q.pop();vis[u]=false; 27 for(int i=0;i<g[u].size();i++) 28 { 29 int v,time; 30 v=g[u][i].t; time=g[u][i].w; 31 32 int t=d[u]%(g[u][i].a+g[u][i].b); 33 int temp=0; 34 if(t<=g[u][i].a) 35 { 36 int tt; 37 tt=t+time; 38 if(tt<=g[u][i].a) 39 temp=0; 40 else 41 { 42 temp=g[u][i].a+g[u][i].b-t; 43 } 44 } 45 else 46 { 47 temp=g[u][i].a+g[u][i].b-t; 48 } 49 if(d[u]+temp+time<d[v]) 50 { 51 d[v]=d[u]+temp+time; 52 if(!vis[v]) 53 { 54 q.push(v); 55 vis[v]=true; 56 } 57 } 58 } 59 } 60 return d[ans]; 61 } 62 63 int main() 64 { 65 int m,s,t,e,w,a,b,p=1,start,final1; 66 while(scanf("%d%d%d%d",&n,&m,&start,&final1)>0) 67 { 68 for(int i=0;i<=n;i++) 69 g[i].clear(); 70 for(int i=0;i<m;i++) 71 { 72 scanf("%d%d",&a,&b); 73 scanf("%d%d%d",&s,&e,&w); 74 if(s<w) 75 continue; 76 node temp; 77 temp.t=b; temp.a=s; temp.b=e; temp.w=w; 78 g[a].push_back(temp); 79 } 80 printf("Case %d: %d ",p++,spfa(start,final1)); 81 } 82 return 0; 83 }