标签:
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1534 Accepted Submission(s): 334
题意:
问有几种最短路的方案。每条边只能经过一次。
分析:
跑一遍最短路,若某条边是最短路的中的边,则连一条对应的容量为1的边,然后dinic搞一下就行
1 //##################### 2 //Author:fraud 3 //Blog: http://www.cnblogs.com/fraud/ 4 //##################### 5 #include <iostream> 6 #include <sstream> 7 #include <ios> 8 #include <iomanip> 9 #include <functional> 10 #include <algorithm> 11 #include <vector> 12 #include <string> 13 #include <list> 14 #include <queue> 15 #include <deque> 16 #include <stack> 17 #include <set> 18 #include <map> 19 #include <cstdio> 20 #include <cstdlib> 21 #include <cmath> 22 #include <cstring> 23 #include <climits> 24 #include <cctype> 25 using namespace std; 26 #define XINF INT_MAX 27 #define INF 0x3FFFFFFF 28 #define MP(X,Y) make_pair(X,Y) 29 #define PB(X) push_back(X) 30 #define REP(X,N) for(int X=0;X<N;X++) 31 #define REP2(X,L,R) for(int X=L;X<=R;X++) 32 #define DEP(X,R,L) for(int X=R;X>=L;X--) 33 #define CLR(A,X) memset(A,X,sizeof(A)) 34 #define IT iterator 35 typedef long long ll; 36 typedef pair<int,int> PII; 37 typedef vector<PII> VII; 38 typedef vector<int> VI; 39 #define MAXN 1600 40 vector<PII> Map[MAXN]; 41 42 43 void init() { REP(i,MAXN) Map[i].clear(); } 44 45 int dis[MAXN]; 46 void dijkstra(int s) 47 { 48 REP(i,MAXN){dis[i]=i==s?0:INF;} 49 int vis[MAXN] = {0}; 50 priority_queue<PII, vector<PII>, greater<PII> > q; 51 q.push(MP(0,s)); 52 while(!q.empty()) 53 { 54 PII p = q.top(); q.pop(); 55 int x = p.second; 56 if(vis[x])continue; 57 vis[x] = 1; 58 for(vector<PII>::iterator it = Map[x].begin(); it != Map[x].end(); it++) 59 { 60 int y = it->first; 61 int d = it->second; 62 if(!vis[y] && dis[y] > dis[x] + d) 63 { 64 dis[y] = dis[x] + d; 65 q.push(MP(dis[y],y)); 66 } 67 } 68 } 69 } 70 struct edge{ 71 int to,cap,rev; 72 edge(int _to,int _cap,int _rev) 73 { 74 to=_to; 75 cap=_cap; 76 rev=_rev; 77 } 78 }; 79 const int MAX_V=2020; 80 vector<edge>G[MAX_V]; 81 int iter[MAX_V]; 82 int level[MAX_V]; 83 int tot=0; 84 void add_edge(int from,int to,int cap) 85 { 86 G[from].PB(edge(to,cap,G[to].size())); 87 G[to].PB(edge(from,0,G[from].size()-1)); 88 } 89 void bfs(int s,int t) 90 { 91 CLR(level,-1); 92 queue<int>q; 93 level[s]=0; 94 q.push(s); 95 while(!q.empty()) 96 { 97 int u=q.front(); 98 q.pop(); 99 for(int i=0;i<G[u].size();i++) 100 { 101 edge &e=G[u][i]; 102 if(e.cap>0&&level[e.to]<0) 103 { 104 level[e.to]=level[u]+1; 105 q.push(e.to); 106 } 107 } 108 } 109 } 110 int dfs(int v,int t,int f) 111 { 112 if(v==t)return f; 113 for(int &i=iter[v];i<G[v].size();i++) 114 { 115 edge &e=G[v][i]; 116 if(e.cap>0&&level[v]<level[e.to]) 117 { 118 int d=dfs(e.to,t,min(f,e.cap)); 119 if(d>0) 120 { 121 e.cap-=d;; 122 G[e.to][e.rev].cap+=d; 123 return d; 124 } 125 } 126 } 127 return 0; 128 } 129 int Dinic(int s,int t) 130 { 131 int flow=0; 132 for(;;) 133 { 134 bfs(s,t); 135 if(level[t]<0)return flow; 136 memset(iter,0,sizeof(iter)); 137 int f; 138 while((f=dfs(s,t,INF))>0) 139 { 140 flow+=f; 141 } 142 } 143 } 144 145 int main() 146 { 147 ios::sync_with_stdio(false); 148 int t; 149 scanf("%d",&t); 150 while(t--){ 151 int n; 152 init(); 153 scanf("%d",&n); 154 int u,v,d; 155 while(scanf("%d%d%d",&u,&v,&d)&&(u||v||d)){ 156 u--; 157 v--; 158 Map[u].PB(MP(v,d)); 159 Map[v].PB(MP(u,d)); 160 } 161 if(n==1){ 162 printf("0\n"); 163 continue; 164 } 165 for(int i=0;i<n;i++)G[i].clear(); 166 dijkstra(0); 167 for(int i=0;i<n;i++){ 168 for(vector<PII>::iterator it = Map[i].begin(); it != Map[i].end(); it++) 169 { 170 int y = it->first; 171 int d = it->second; 172 if(dis[i]+d==dis[y]){ 173 add_edge(i,y,1); 174 } 175 } 176 } 177 printf("%d\n",Dinic(0,n-1)); 178 } 179 180 181 return 0; 182 }
标签:
原文地址:http://www.cnblogs.com/fraud/p/4354735.html