kuangbin4(上)
熟悉链式前向星和邻接矩阵;http://blog.csdn.net/chang_mu/article/details/38172311
[A - Til the Cows Come Home POJ - 2387 ]
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define CLR(a,v) memset(a,v, sizeof a)
#define maxnplus 9999999
int mp[2010][2010];
int dist[2010];
int vis[2010];
using namespace std;
int T,N;
int getNode(){
int tempmin = 0x3f3f3f3f;
int u = -1;
for(int i = 2; i <= N; i++)
if(!vis[i] && dist[i]!= -1 && dist[i] < tempmin){
tempmin = dist[i];
u = i;
}
return u;
}
long long dijkstra(){
for(int i = 1; i <= N; i++){
if(mp[1][i]+1)dist[i] = mp[1][i];
}
int u = getNode();
while(u+1){
for(int i = 2; i <= N; i++){
if(vis[i])continue;
if(mp[u][i]+1 && dist[i] == -1)
dist[i] = dist[u] + mp[u][i];
else if(mp[u][i]+1 && dist[i])
dist[i] = min(dist[u] + mp[u][i],dist[i]);
}
vis[u] = 1;
u = getNode();
}
return dist[N];
}
void init(){
CLR(mp,-1);
CLR(dist,-1);
CLR(vis,0);
}
int main(){
while(cin >> T >> N){
init();
int st,ed,lens;
for(int i = 1; i <= T; i++){
cin >> st>> ed >> lens ;
if(mp[st][ed]!=-1)
mp[st][ed] = mp[ed][st] = min(lens,mp[ed][st]);
else
mp[st][ed] = mp[ed][st] = lens;
mp[i][i] = 0;
}
long long ans = dijkstra();
cout << ans << endl;
}
}
[B - Frogger POJ - 2253]
//中间加了输出,有助于理解。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#define dic(x1,y1,x2,y2) sqrt(pow(x1-x2,2)+pow(y1-y2,2))
#define CLR(a,v) memset(a,v,sizeof a)
using namespace std;
pair<int,int>a[300];
double mp[300][300];
int close[300];
double closedis[300];
void init(){
CLR(mp,0);
CLR(close,0);
CLR(closedis,0);
CLR(a,0);
}
int main(){
int k = 0;
int n;
while(cin >> n && n){
double ans = 0;
for(int i = 0; i < n; i++){
cin >> a[i].first >> a[i].second;
}
for(int i = 0; i < n; i++)
for(int j = i; j < n; j++)
mp[i][j] = mp[j][i] = 1.0 * dic(a[i].first, a[i].second, a[j].first, a[j].second);
for(int i = 0; i < n; i++){
closedis[i] = mp[0][i];
close[i] = 0;
}
for(int i = 0; i < n - 1; i++){
double mindic = 1.0*(1<<20);
int minone;
for(int j = 0; j < n; j++){
if(closedis[j] && mindic > closedis[j]){
mindic = closedis[j];
minone = j;
}
}
cout << i << ":";
for(int m = 0; m < n; m++)
cout << closedis[m] << " ";
cout << endl;
if(ans < mindic)
ans = mindic;
cout << "ans:" <<ans <<endl;
cout << "minone:" << minone << endl;
closedis[minone] = 0.0;//didn't visit it again;
if(minone == 1)
break;
for(int j = 0; j < n; j++){
if(mp[j][minone] < closedis[j]){
closedis[j] = mp[j][minone];
}
}
}
printf("Scenario #%d\n",++k);
printf("Frog Distance = %.3f\n\n",ans);
}
return 0;
}
[C - Heavy Transportation POJ - 1797]
#include<cstdio>
#include<iostream>
#include<cstring>
#define CLR(a,v) memset(a,v,sizeof a)
using namespace std;
int mp[1100][1100]={0};
int closedis[1100] = {0};
int ans,n,m;
void init(){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++)
mp[i][j] = 0;
closedis[i] = 0;
}
ans = 0x3f3f3f3f;
}
int main(){
int k=0,T;
scanf("%d",&T);
while(++k <= T){
scanf("%d%d",&n,&m);
init();
int from,to,w;
for(int i = 0; i < m; i++){
scanf("%d%d%d",&from,&to,&w);
if(!mp[from][to])
mp[from][to] = mp[to][from] = w;
else
mp[from][to] = mp[to][from] = max(w,mp[from][to]);
}
for(int i = 1; i <= n; i++){
closedis[i] = mp[1][i];
}
for(int i = 1;i <= n; i ++){
int minone;
int maxdis = 0;
//find the location to the tree closest;
for(int j = 1; j <= n; j++){
if(closedis[j] > maxdis){
maxdis = closedis[j];
minone = j;
}
}
if(ans > maxdis)
ans = maxdis;
closedis[minone] = -1;
if(minone == n)break;
for(int i = 1; i <= n; i++){
if(closedis[i]+1) closedis[i] = max(closedis[i],mp[minone][i]);
}
}
printf("Scenario #%d:\n%d\n",k,ans);
if(k<T)printf("\n");
}
return 0;
}
[D - Silver Cow PartyPOJ - 3268]
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define CLR(a,v) memset(a,v,sizeof a)
int mp[1100][1000];
int time[1100];
using namespace std;
int n, m, X, ans;
int dist[1100],vis[1100];
int todist[1100],tovis[1100];
void init(){
ans = 0;
for(int i = 1 ; i <= n; i++){
for(int j = 1; j <= n; j++)
mp[i][j] = -1;
time[i] = 0;
}
}
int getNode(int *a, int *b){
int temp = 0x3f3f3f3f;
int u = -1;
for(int i = 1 ; i <= n; i++)
if(!b[i] && a[i]>0 && a[i] < temp){
temp = a[i];
u = i;
}
return u;
}
void dijkstra(int a){
CLR(vis,0);
CLR(dist,0);
for(int i = 1; i <= n; i++){
dist[i] = mp[a][i];
}
int u = getNode(dist,vis);
while(u+1){
for(int i = 1; i <= n; i++){
if(vis[i])continue;
if(mp[u][i]<=0)continue;
if(dist[i]<=0)dist[i] = dist[u] + mp[u][i];
else dist[i] = min(dist[i], dist[u] + mp[u][i]);
}
vis[u] = 1;
u = getNode(dist,vis);
}
}
void to_dijkstra(int a){
CLR(tovis,0);
CLR(todist,0);
for(int i = 1; i <= n; i++){
todist[i] = mp[i][a];
}
int u = getNode(todist,tovis);
while(u+1){
for(int i = 1; i <= n; i++){
if(tovis[i])continue;
if(mp[i][u]<=0)continue;
if(todist[i]<=0)todist[i] = todist[u] + mp[i][u];
else todist[i] = min(todist[i], todist[u] + mp[i][u]);
}
tovis[u] = 1;
u = getNode(todist,tovis);
}
}
int main(){
while(cin >> n >> m >> X){
init();
int from, to, w;
for(int i = 0; i < m; i++){
cin >> from >> to >> w;
if(mp[from][to]<=0)
mp[from][to] = w;
else mp[from][to] = min(mp[from][to], w);
}
dijkstra(X);
to_dijkstra(X);
for(int i =1 ; i<= n; i++){
if(i == X)continue;
time[i] = dist[i] + todist[i];
ans = max(ans, time[i]);
}
cout << ans <<endl;
}
return 0;
}
[E - Currency Exchange POJ - 1860]
#include<cstdio>
#include<iostream>
#include<cstring>
#define CLR(a,v) memset(a,v,sizeof a)
using namespace std;
struct Node{
int from;
int to;
double r,c;
};
Node edge[320];
int N,M,S;
double V;
double maxm[320];
bool ford(){
for(int i = 1; i <= N; i++)maxm[i] = 0.0;
maxm[S] = V;
//relax
for(int i = 1; i <= N; i++){
bool flag = false;
for(int j = 0; j < 2*M; j++){
if(maxm[edge[j].from]<edge[j].c)continue;
if(maxm[edge[j].to ] < (maxm[edge[j].from ] - edge[j].c)*edge[j].r){
maxm[edge[j].to ] = (maxm[edge[j].from ] - edge[j].c)*edge[j].r;
flag = true;
}
}
if(!flag)break;
}
//judge
for(int i = 0; i < 2*M; i++)
if(maxm[edge[i].to ] < (maxm[edge[i].from ] - edge[i].c)*edge[i].r)
return true;
return false;
}
void init(){
CLR(edge,0);
}
int main(){
while(cin >> N >> M >> S >> V){
init();
int A,B;
double r1,c1,r2,c2;
for(int i = 0; i < M; i++){
cin >> A >> B >> r1 >> c1 >> r2 >> c2;
edge[i].from = A;edge[i].to = B;
edge[i].r = r1;edge[i].c = c1;
edge[i+M].to = A;edge[i+M].from = B;
edge[i+M].r = r2;edge[i+M].c = c2;
}
if(ford())cout <<"YES"<<endl;
else cout <<"NO"<<endl;
}
return 0;
}
[H - Cow Contest POJ - 3660 ]
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int mp[200][200];
int main(){
int n,m;
while(cin >> n >> m){
int a,b;
for(int i = 0 ; i < m; i++){
cin >> a >> b;
mp[a][b] = 1;
}
for(int k = 1; k <=n; k++ )
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(mp[i][k]&&mp[k][j])
mp[i][j] = 1;
int ans = 0;
for(int i = 1; i <= n; i++){
int j;
for(j = 1; j <= n; j++){
if(i==j)continue;
else if(!mp[i][j]&&!mp[j][i])break;
}
if(j>n)ans++;
}
cout << ans <<endl;
}
return 0;
}
//floyed,即看即会。
[I - Arbitrage POJ - 2240]
#include<cstdio>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<string>
#define CLR(a,v) memset(a,v,sizeof a)
using namespace std;
struct Node{
int from;
int to;
double r;
};
map<string, int> a;
Node edge[4000];
int N,M,S;
double V;
double maxm[320];
bool ford(){
for(int i = 1; i <= N; i++)maxm[i] = 0.0;
maxm[1] = 10;
//relax
for(int i = 1; i <= N; i++){
bool flag = false;
for(int j = 0; j < 2*M; j++){
if(maxm[edge[j].to ] < maxm[edge[j].from] * edge[j].r ){
maxm[edge[j].to ] = maxm[edge[j].from] * edge[j].r ;
flag = true;
}
}
if(!flag)break;
}
//judge
for(int i = 0; i < 2*M; i++)
if(maxm[edge[i].to ] < maxm[edge[i].from] * edge[i].r)
return true;
return false;
}
void init(){
CLR(edge,0);
}
int main(){
int T=0;
while(cin >> N && N){
init();
for(int i = 0; i < N; i++){
string temp;
cin >> temp;
a[temp] = i;
}
cin >> M;
for(int i = 0; i < M; i++){
string temp_f,temp_t;
double temp_m;
cin >> temp_f >> temp_m >> temp_t;
edge[i].from = a[temp_f];
edge[i].to = a[temp_t];
edge[i].r = temp_m;
}
printf("Case %d: ",++T);
if(ford())cout << "Yes"<<endl;
else cout << "No" << endl;
}
return 0;
}
J - Invitation Cards POJ - 1511